%!
%%BoundingBox: (atend)
%%Pages: (atend)
%%DocumentFonts: (atend)
%%EndComments
%
% FrameMaker PostScript Prolog 2.0, for use with FrameMaker 2.0
% Copyright (c) 1986,87,89 by Frame Technology, Inc.  All rights reserved.
%
% Known Problems:
%	Due to bugs in Transcript, the 'PS-Adobe-' is omitted from line 1
/FMversion (2.0) def 
% Set up Color vs. Black-and-White
	/FMPrintInColor systemdict /colorimage known def
% Uncomment this line to force b&w on color printer
%   /FMPrintInColor false def
/FrameDict 190 dict def 
systemdict /errordict known not {/errordict 10 dict def
		errordict /rangecheck {stop} put} if
% The readline in 23.0 doesn't recognize cr's as nl's on AppleTalk
FrameDict /tmprangecheck errordict /rangecheck get put 
errordict /rangecheck {FrameDict /bug true put} put 
FrameDict /bug false put 
mark 
% Some PS machines read past the CR, so keep the following 3 lines together!
currentfile 5 string readline
00
0000000000
cleartomark 
errordict /rangecheck FrameDict /tmprangecheck get put 
FrameDict /bug get { 
	/readline {
		/gstring exch def
		/gfile exch def
		/gindex 0 def
		{
			gfile read pop 
			dup 10 eq {exit} if 
			dup 13 eq {exit} if 
			gstring exch gindex exch put 
			/gindex gindex 1 add def 
		} loop
		pop 
		gstring 0 gindex getinterval true 
		} def
	} if
/FMVERSION {
	FMversion ne {
		/Times-Roman findfont 18 scalefont setfont
		100 100 moveto
		(FrameMaker version does not match postscript_prolog!)
		dup =
		show showpage
		} if
	} def 
/FMLOCAL {
	FrameDict begin
	0 def 
	end 
	} def 
	/gstring FMLOCAL
	/gfile FMLOCAL
	/gindex FMLOCAL
	/orgxfer FMLOCAL
	/orgproc FMLOCAL
	/organgle FMLOCAL
	/orgfreq FMLOCAL
	/yscale FMLOCAL
	/xscale FMLOCAL
	/manualfeed FMLOCAL
	/paperheight FMLOCAL
	/paperwidth FMLOCAL
/FMDOCUMENT { 
	array /FMfonts exch def 
	/#copies exch def
	FrameDict begin
	0 ne dup {setmanualfeed} if
	/manualfeed exch def
	/paperheight exch def
	/paperwidth exch def
	setpapername
	manualfeed {true} {papersize} ifelse 
	{manualpapersize} {false} ifelse 
	{desperatepapersize} if
	/yscale exch def
	/xscale exch def
	currenttransfer cvlit /orgxfer exch def
	currentscreen cvlit /orgproc exch def
	/organgle exch def /orgfreq exch def
	end 
	} def 
	/pagesave FMLOCAL
	/orgmatrix FMLOCAL
	/landscape FMLOCAL
/FMBEGINPAGE { 
	FrameDict begin 
	/pagesave save def
	3.86 setmiterlimit
	/landscape exch 0 ne def
	landscape { 
		90 rotate 0 exch neg translate pop 
		}
		{pop pop}
		ifelse
	xscale yscale scale
	/orgmatrix matrix def
	gsave 
	} def 
/FMENDPAGE {
	grestore 
	pagesave restore
	end 
	showpage
	} def 
/FMDEFINEFONT { 
	FrameDict begin
	findfont 
	ReEncode 
	2 index exch 
	definefont exch 
	scalefont 
	FMfonts 3 1 roll 
	put
	end 
	} bind def
/FMNORMALIZEGRAPHICS { 
	newpath
	0.0 0.0 moveto
	1 setlinewidth
	0 setlinecap
	0 0 0 sethsbcolor
	0 setgray 
	} bind def
	/fx FMLOCAL
	/fy FMLOCAL
	/fh FMLOCAL
	/fw FMLOCAL
	/llx FMLOCAL
	/lly FMLOCAL
	/urx FMLOCAL
	/ury FMLOCAL
/FMBEGINEPSF { 
	end 
	/FMEPSF save def 
	/showpage {} def 
	FMNORMALIZEGRAPHICS 
	[/fy /fx /fh /fw /ury /urx /lly /llx] {exch def} forall 
	fx fy translate 
	rotate
	fw urx llx sub div fh ury lly sub div scale 
	llx neg lly neg translate 
	} bind def
/FMENDEPSF {
	FMEPSF restore
	FrameDict begin 
	} bind def
FrameDict begin 
/setmanualfeed {
%%BeginFeature *ManualFeed True
	 statusdict /manualfeed true put
%%EndFeature
	} def
/max {2 copy lt {exch} if pop} bind def
/min {2 copy gt {exch} if pop} bind def
/inch {72 mul} def
/pagedimen { 
	paperheight sub abs 16 lt exch 
	paperwidth sub abs 16 lt and
	{/papername exch def} {pop} ifelse
	} def
	/papersizedict FMLOCAL
/setpapername { 
	/papersizedict 14 dict def 
	papersizedict begin
	/papername /unknown def 
		/Letter 8.5 inch 11.0 inch pagedimen
		/LetterSmall 7.68 inch 10.16 inch pagedimen
		/Tabloid 11.0 inch 17.0 inch pagedimen
		/Ledger 17.0 inch 11.0 inch pagedimen
		/Legal 8.5 inch 14.0 inch pagedimen
		/Statement 5.5 inch 8.5 inch pagedimen
		/Executive 7.5 inch 10.0 inch pagedimen
		/A3 11.69 inch 16.5 inch pagedimen
		/A4 8.26 inch 11.69 inch pagedimen
		/A4Small 7.47 inch 10.85 inch pagedimen
		/B4 10.125 inch 14.33 inch pagedimen
		/B5 7.16 inch 10.125 inch pagedimen
	end
	} def
/papersize {
	papersizedict begin
		/Letter {lettertray} def
		/LetterSmall {lettertray lettersmall} def
		/Tabloid {11x17tray} def
		/Ledger {ledgertray} def
		/Legal {legaltray} def
		/Statement {statementtray} def
		/Executive {executivetray} def
		/A3 {a3tray} def
		/A4 {a4tray} def
		/A4Small {a4tray a4small} def
		/B4 {b4tray} def
		/B5 {b5tray} def
		/unknown {unknown} def
	papersizedict dup papername known {papername} {/unknown} ifelse get
	end
	statusdict begin stopped end 
	} def
/manualpapersize {
	papersizedict begin
		/Letter {letter} def
		/LetterSmall {lettersmall} def
		/Tabloid {11x17} def
		/Ledger {ledger} def
		/Legal {legal} def
		/Statement {statement} def
		/Executive {executive} def
		/A3 {a3} def
		/A4 {a4} def
		/A4Small {a4small} def
		/B4 {b4} def
		/B5 {b5} def
		/unknown {unknown} def
	papersizedict dup papername known {papername} {/unknown} ifelse get
	end
	stopped 
	} def
/desperatepapersize {
	statusdict /setpageparams known
		{
		paperwidth paperheight 0 1 
		statusdict begin
		{setpageparams} stopped pop 
		end
		} if
	} def
/savematrix {
	orgmatrix currentmatrix pop
	} bind def
/restorematrix {
	orgmatrix setmatrix
	} bind def
/dmatrix matrix def
/dpi    72 0 dmatrix defaultmatrix dtransform
    dup mul exch   dup mul add   sqrt def
/freq dpi 18.75 div 8 div round dup 0 eq {pop 1} if 8 mul dpi exch div def
/sangle 1 0 dmatrix defaultmatrix dtransform exch atan def
/DiacriticEncoding [
/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
/.notdef /.notdef /.notdef /.notdef /space /exclam /quotedbl
/numbersign /dollar /percent /ampersand /quotesingle /parenleft
/parenright /asterisk /plus /comma /hyphen /period /slash /zero /one
/two /three /four /five /six /seven /eight /nine /colon /semicolon
/less /equal /greater /question /at /A /B /C /D /E /F /G /H /I /J /K
/L /M /N /O /P /Q /R /S /T /U /V /W /X /Y /Z /bracketleft /backslash
/bracketright /asciicircum /underscore /grave /a /b /c /d /e /f /g /h
/i /j /k /l /m /n /o /p /q /r /s /t /u /v /w /x /y /z /braceleft /bar
/braceright /asciitilde /.notdef /Adieresis /Aring /Ccedilla /Eacute
/Ntilde /Odieresis /Udieresis /aacute /agrave /acircumflex /adieresis
/atilde /aring /ccedilla /eacute /egrave /ecircumflex /edieresis
/iacute /igrave /icircumflex /idieresis /ntilde /oacute /ograve
/ocircumflex /odieresis /otilde /uacute /ugrave /ucircumflex
/udieresis /dagger /.notdef /cent /sterling /section /bullet
/paragraph /germandbls /registered /copyright /trademark /acute
/dieresis /.notdef /AE /Oslash /.notdef /.notdef /.notdef /.notdef
/yen /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
/ordfeminine /ordmasculine /.notdef /ae /oslash /questiondown
/exclamdown /logicalnot /.notdef /florin /.notdef /.notdef
/guillemotleft /guillemotright /ellipsis /.notdef /Agrave /Atilde
/Otilde /OE /oe /endash /emdash /quotedblleft /quotedblright
/quoteleft /quoteright /.notdef /.notdef /ydieresis /Ydieresis
/fraction /currency /guilsinglleft /guilsinglright /fi /fl /daggerdbl
/periodcentered /quotesinglbase /quotedblbase /perthousand
/Acircumflex /Ecircumflex /Aacute /Edieresis /Egrave /Iacute
/Icircumflex /Idieresis /Igrave /Oacute /Ocircumflex /.notdef /Ograve
/Uacute /Ucircumflex /Ugrave /dotlessi /circumflex /tilde /macron
/breve /dotaccent /ring /cedilla /hungarumlaut /ogonek /caron
] def
/ReEncode { 
	dup 
	length 
	dict begin 
	{
	1 index /FID ne 
		{def} 
		{pop pop} ifelse 
	} forall
	Encoding StandardEncoding eq 
	{
		/Encoding DiacriticEncoding def
	}if
	currentdict 
	end 
	} bind def
/graymode true def
	/bwidth FMLOCAL
	/bpside FMLOCAL
	/bstring FMLOCAL
	/onbits FMLOCAL
	/offbits FMLOCAL
	/xindex FMLOCAL
	/yindex FMLOCAL
	/x FMLOCAL
	/y FMLOCAL
/setpattern {
	 /bwidth  exch def
	 /bpside  exch def
	 /bstring exch def
	 /onbits 0 def  /offbits 0 def
	 freq sangle landscape {90 add} if 
		{/y exch def
		 /x exch def
		 /xindex x 1 add 2 div bpside mul cvi def
		 /yindex y 1 add 2 div bpside mul cvi def
		 bstring yindex bwidth mul xindex 8 idiv add get
		 1 7 xindex 8 mod sub bitshift and 0 ne
		 {/onbits  onbits  1 add def 1}
		 {/offbits offbits 1 add def 0}
		 ifelse
		}
		setscreen
	 {} settransfer
	 offbits offbits onbits add div FMsetgray
	/graymode false def
	} bind def
/grayness {
	FMsetgray
	graymode not {
		/graymode true def
		orgxfer cvx settransfer
		orgfreq organgle orgproc cvx setscreen
		} if
	} bind def
	/HUE FMLOCAL
	/SAT FMLOCAL
	/BRIGHT FMLOCAL
	/Colors FMLOCAL
FMPrintInColor 
	
	{
	/HUE 0 def
	/SAT 0 def
	/BRIGHT 0 def
	% array of arrays Hue and Sat values for the separations [HUE BRIGHT]
	/Colors   
	[[0    0  ]    % black
	 [0    0  ]    % white
	 [0.00 1.0]    % red
	 [0.37 1.0]    % green
	 [0.60 1.0]    % blue
	 [0.50 1.0]    % cyan
	 [0.83 1.0]    % magenta
	 [0.16 1.0]    % comment / yellow
	 ] def
      
	/BEGINBITMAPCOLOR { 
		BITMAPCOLOR} def
	/BEGINBITMAPCOLORc { 
		BITMAPCOLORc} def
	/K { 
		Colors exch get dup
		0 get /HUE exch store 
		1 get /BRIGHT exch store
		  HUE 0 eq BRIGHT 0 eq and
			{1.0 SAT sub setgray}
			{HUE SAT BRIGHT sethsbcolor} 
		  ifelse
		} def
	/FMsetgray { 
		/SAT exch 1.0 exch sub store 
		  HUE 0 eq BRIGHT 0 eq and
			{1.0 SAT sub setgray}
			{HUE SAT BRIGHT sethsbcolor} 
		  ifelse
		} bind def
	}
	
	{
	/BEGINBITMAPCOLOR { 
		BITMAPGRAY} def
	/BEGINBITMAPCOLORc { 
		BITMAPGRAYc} def
	/FMsetgray {setgray} bind def
	/K { 
		pop
		} def
	}
ifelse
/normalize {
	transform round exch round exch itransform
	} bind def
/dnormalize {
	dtransform round exch round exch idtransform
	} bind def
/lnormalize { 
	0 dtransform exch cvi 2 idiv 2 mul 1 add exch idtransform pop
	} bind def
/H { 
	lnormalize setlinewidth
	} bind def
/Z {
	setlinecap
	} bind def
/X { 
	fillprocs exch get exec
	} bind def
/V { 
	gsave eofill grestore
	} bind def
/N { 
	stroke
	} bind def
/M {newpath moveto} bind def
/E {lineto} bind def
/D {curveto} bind def
/O {closepath} bind def
	/n FMLOCAL
/L { 
 	/n exch def
	newpath
	normalize
	moveto 
	2 1 n {pop normalize lineto} for
	} bind def
/Y { 
	L 
	closepath
	} bind def
	/x1 FMLOCAL
	/x2 FMLOCAL
	/y1 FMLOCAL
	/y2 FMLOCAL
	/rad FMLOCAL
/R { 
	/y2 exch def
	/x2 exch def
	/y1 exch def
	/x1 exch def
	x1 y1
	x2 y1
	x2 y2
	x1 y2
	4 Y 
	} bind def
/RR { 
	/rad exch def
	normalize
	/y2 exch def
	/x2 exch def
	normalize
	/y1 exch def
	/x1 exch def
	newpath
	x1 y1 rad add moveto
	x1 y2 x2 y2 rad arcto
	x2 y2 x2 y1 rad arcto
	x2 y1 x1 y1 rad arcto
	x1 y1 x1 y2 rad arcto
	closepath
	16 {pop} repeat
	} bind def
/C { 
	grestore
	gsave
	R 
	clip
	} bind def
/U { 
	grestore
	gsave
	} bind def
/F { 
	FMfonts exch get
	setfont
	} bind def
/T { 
	moveto show
	} bind def
/RF { 
	rotate
	0 ne {-1 1 scale} if
	} bind def
/TF { 
	gsave
	moveto 
	RF
	show
	grestore
	} bind def
/P { 
	moveto
	0 32 3 2 roll widthshow
	} bind def
/PF { 
	gsave
	moveto 
	RF
	0 32 3 2 roll widthshow
	grestore
	} bind def
/S { 
	moveto
	0 exch ashow
	} bind def
/SF { 
	gsave
	moveto
	RF
	0 exch ashow
	grestore
	} bind def
/B { 
	moveto
	0 32 4 2 roll 0 exch awidthshow
	} bind def
/BF { 
	gsave
	moveto
	RF
	0 32 4 2 roll 0 exch awidthshow
	grestore
	} bind def
	/x FMLOCAL
	/y FMLOCAL
	/dx FMLOCAL
	/dy FMLOCAL
	/dl FMLOCAL
	/t FMLOCAL
	/t2 FMLOCAL
	/Cos FMLOCAL
	/Sin FMLOCAL
	/r FMLOCAL
/W { 
	dnormalize
	/dy exch def
	/dx exch def
	normalize
	/y  exch def
	/x  exch def
	/dl dx dx mul dy dy mul add sqrt def
	dl 0.0 gt {
		/t currentlinewidth def
		savematrix
		/Cos dx dl div def
		/Sin dy dl div def
		/r [Cos Sin Sin neg Cos 0.0 0.0] def
		/t2 t 2.5 mul 3.5 max def
		newpath
		x y translate
		r concat
		0.0 0.0 moveto
		dl t 2.7 mul sub 0.0 rlineto
		stroke
		restorematrix
		x dx add y dy add translate
		r concat
		t 0.67 mul setlinewidth
		t 1.61 mul neg  0.0 translate
		0.0 0.0 moveto
		t2 1.7 mul neg  t2 2.0 div     moveto
		0.0 0.0 lineto
		t2 1.7 mul neg  t2 2.0 div neg lineto
		stroke
		t setlinewidth
		restorematrix
		} if
	} bind def
/G { 
	gsave
	newpath
	normalize translate 0.0 0.0 moveto 
	dnormalize scale 
	0.0 0.0 1.0 5 3 roll arc 
	closepath fill
	grestore
	} bind def
/A { 
	gsave
	savematrix
	newpath
	2 index 2 div add exch 3 index 2 div sub exch 
	normalize 2 index 2 div sub exch 3 index 2 div add exch 
	translate 
	scale 
	0.0 0.0 1.0 5 3 roll arc 
	restorematrix
	stroke
	grestore
	} bind def
	/x FMLOCAL
	/y FMLOCAL
	/w FMLOCAL
	/h FMLOCAL
	/xx FMLOCAL
	/yy FMLOCAL
	/ww FMLOCAL
	/hh FMLOCAL
	/FMsaveobject FMLOCAL
	/FMoptop FMLOCAL
	/FMdicttop FMLOCAL
/BEGINPRINTCODE { 
	/FMdicttop countdictstack 1 add def 
	/FMoptop count 4 sub def 
	/FMsaveobject save def
	userdict begin 
	/showpage {} def 
	FMNORMALIZEGRAPHICS 
	3 index neg 3 index neg translate
	} bind def
/ENDPRINTCODE {
	count -1 FMoptop {pop pop} for 
	countdictstack -1 FMdicttop {pop end} for 
	FMsaveobject restore 
	} bind def
/gn { 
	0 
	{	46 mul 
		cf read pop 
		32 sub 
		dup 46 lt {exit} if 
		46 sub add 
		} loop
	add 
	} bind def
	/str FMLOCAL
/cfs { 
	/str sl string def 
	0 1 sl 1 sub {str exch val put} for 
	str def 
	} bind def
/ic [ 
	0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0223
	0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0223
	0
	{0 hx} {1 hx} {2 hx} {3 hx} {4 hx} {5 hx} {6 hx} {7 hx} {8 hx} {9 hx}
	{10 hx} {11 hx} {12 hx} {13 hx} {14 hx} {15 hx} {16 hx} {17 hx} {18 hx}
	{19 hx} {gn hx} {0} {1} {2} {3} {4} {5} {6} {7} {8} {9} {10} {11} {12}
	{13} {14} {15} {16} {17} {18} {19} {gn} {0 wh} {1 wh} {2 wh} {3 wh}
	{4 wh} {5 wh} {6 wh} {7 wh} {8 wh} {9 wh} {10 wh} {11 wh} {12 wh}
	{13 wh} {14 wh} {gn wh} {0 bl} {1 bl} {2 bl} {3 bl} {4 bl} {5 bl} {6 bl}
	{7 bl} {8 bl} {9 bl} {10 bl} {11 bl} {12 bl} {13 bl} {14 bl} {gn bl}
	{0 fl} {1 fl} {2 fl} {3 fl} {4 fl} {5 fl} {6 fl} {7 fl} {8 fl} {9 fl}
	{10 fl} {11 fl} {12 fl} {13 fl} {14 fl} {gn fl}
	] def
	/sl FMLOCAL
	/val FMLOCAL
	/ws FMLOCAL
	/im FMLOCAL
	/bs FMLOCAL
	/cs FMLOCAL
	/len FMLOCAL
	/pos FMLOCAL
/ms { 
	/sl exch def 
	/val 255 def 
	/ws cfs 
	/im cfs 
	/val 0 def 
	/bs cfs 
	/cs cfs 
	} bind def
400 ms 
/ip { 
	is 
	0 
	cf cs readline pop 
	{	ic exch get exec 
		add 
		} forall 
	pop 
	
	} bind def
/wh { 
	/len exch def 
	/pos exch def 
	ws 0 len getinterval im pos len getinterval copy pop
	pos len 
	} bind def
/bl { 
	/len exch def 
	/pos exch def 
	bs 0 len getinterval im pos len getinterval copy pop
	pos len 
	} bind def
/s1 1 string def
/fl { 
	/len exch def 
	/pos exch def 
	/val cf s1 readhexstring pop 0 get def
	pos 1 pos len add 1 sub {im exch val put} for
	pos len 
	} bind def
/hx { 
	3 copy getinterval 
	cf exch readhexstring pop pop 
	} bind def
	/h FMLOCAL
	/w FMLOCAL
	/d FMLOCAL
	/lb FMLOCAL
	/bitmapsave FMLOCAL
	/is FMLOCAL
	/cf FMLOCAL
/wbytes { 
	dup 
	8 eq {pop} {1 eq {7 add 8 idiv} {3 add 4 idiv} ifelse} ifelse
	} bind def
/BEGINBITMAPBWc { 
	1 {} COMMONBITMAPc
	} bind def
/BEGINBITMAPGRAYc { 
	8 {} COMMONBITMAPc
	} bind def
/BEGINBITMAP2BITc { 
	2 {} COMMONBITMAPc
	} bind def
/COMMONBITMAPc { 
	/r exch def
	/d exch def
	gsave
	translate rotate scale /h exch def /w exch def
	/lb w d wbytes def 
	sl lb lt {lb ms} if 
	/bitmapsave save def 
	r                    
	/is im 0 lb getinterval def 
	ws 0 lb getinterval is copy pop 
	/cf currentfile def 
	w h d [w 0 0 h neg 0 h] 
	{ip} image 
	bitmapsave restore 
	grestore
	} bind def
/BEGINBITMAPBW { 
	1 {} COMMONBITMAP
	} bind def
/BEGINBITMAPGRAY { 
	8 {} COMMONBITMAP
	} bind def
/BEGINBITMAP2BIT { 
	2 {} COMMONBITMAP
	} bind def
/COMMONBITMAP { 
	/r exch def
	/d exch def
	gsave
	translate rotate scale /h exch def /w exch def
	/bitmapsave save def 
	r                    
	/is w d wbytes string def
	/cf currentfile def 
	w h d [w 0 0 h neg 0 h] 
	{cf is readhexstring pop} image
	bitmapsave restore 
	grestore
	} bind def
	/proc1 FMLOCAL
	/proc2 FMLOCAL
	/newproc FMLOCAL
/Fmcc {
    /proc2 exch cvlit def
    /proc1 exch cvlit def
    /newproc proc1 length proc2 length add array def
    newproc 0 proc1 putinterval
    newproc proc1 length proc2 putinterval
    newproc cvx
} bind def
/ngrayt 256 array def
/nredt 256 array def
/nbluet 256 array def
/ngreent 256 array def
	/gryt FMLOCAL
	/blut FMLOCAL
	/grnt FMLOCAL
	/redt FMLOCAL
	/indx FMLOCAL
	/cynu FMLOCAL
	/magu FMLOCAL
	/yelu FMLOCAL
	/k FMLOCAL
	/u FMLOCAL
/colorsetup {
	currentcolortransfer
	/gryt exch def
	/blut exch def
	/grnt exch def
	/redt exch def
	0 1 255 {
		/indx exch def
		/cynu 1 red indx get 255 div sub def
		/magu 1 green indx get 255 div sub def
		/yelu 1 blue indx get 255 div sub def
		/k cynu magu min yelu min def
		/u k currentundercolorremoval exec def
		nredt indx 1 0 cynu u sub max sub redt exec put
		ngreent indx 1 0 magu u sub max sub grnt exec put
		nbluet indx 1 0 yelu u sub max sub blut exec put
		ngrayt indx 1 k currentblackgeneration exec sub gryt exec put
	} for
	{255 mul cvi nredt exch get}
	{255 mul cvi ngreent exch get}
	{255 mul cvi nbluet exch get}
	{255 mul cvi ngrayt exch get}
	setcolortransfer
	{pop 0} setundercolorremoval
	{} setblackgeneration
	} bind def
	/tran FMLOCAL
/fakecolorsetup {
	/tran 256 string def
	0 1 255 {/indx exch def 
		tran indx
		red indx get 77 mul
		green indx get 151 mul
		blue indx get 28 mul
		add add 256 idiv put} for
	currenttransfer
	{255 mul cvi tran exch get 255.0 div}
	exch Fmcc settransfer
} bind def
/BITMAPCOLOR { 
	/d 8 def
	gsave
	translate rotate scale /h exch def /w exch def
	/bitmapsave save def 
	colorsetup
	/is w d wbytes string def
	/cf currentfile def 
	w h d [w 0 0 h neg 0 h] 
	{cf is readhexstring pop} {is} {is} true 3 colorimage 
	bitmapsave restore 
	grestore
	} bind def
/BITMAPCOLORc { 
	/d 8 def
	gsave
	translate rotate scale /h exch def /w exch def
	/lb w d wbytes def 
	sl lb lt {lb ms} if 
	/bitmapsave save def 
	colorsetup
	/is im 0 lb getinterval def 
	ws 0 lb getinterval is copy pop 
	/cf currentfile def 
	w h d [w 0 0 h neg 0 h] 
	{ip} {is} {is} true 3 colorimage
	bitmapsave restore 
	grestore
	} bind def
/BITMAPGRAY { 
	8 {fakecolorsetup} COMMONBITMAP
	} bind def
/BITMAPGRAYc { 
	8 {fakecolorsetup} COMMONBITMAPc
	} bind def
/ENDBITMAP {
	} bind def
end 
%%EndProlog
%%BeginSetup
(2.0) FMVERSION
1 1 612 792 0 1 31 FMDOCUMENT
/fillprocs 32 array def
fillprocs 0 { 0.000000 grayness } put
fillprocs 1 { 0.100000 grayness } put
fillprocs 2 { 0.300000 grayness } put
fillprocs 3 { 0.500000 grayness } put
fillprocs 4 { 0.700000 grayness } put
fillprocs 5 { 0.900000 grayness } put
fillprocs 6 { 0.970000 grayness } put
fillprocs 7 { 1.000000 grayness } put
fillprocs 8 {<0f1e3c78f0e1c387> 8 1 setpattern } put
fillprocs 9 {<0f87c3e1f0783c1e> 8 1 setpattern } put
fillprocs 10 {<cccccccccccccccc> 8 1 setpattern } put
fillprocs 11 {<ffff0000ffff0000> 8 1 setpattern } put
fillprocs 12 {<8142241818244281> 8 1 setpattern } put
fillprocs 13 {<03060c183060c081> 8 1 setpattern } put
fillprocs 14 {<8040201008040201> 8 1 setpattern } put
fillprocs 15 {} put
fillprocs 16 { 1.000000 grayness } put
fillprocs 17 { 0.900000 grayness } put
fillprocs 18 { 0.700000 grayness } put
fillprocs 19 { 0.500000 grayness } put
fillprocs 20 { 0.300000 grayness } put
fillprocs 21 { 0.100000 grayness } put
fillprocs 22 { 0.030000 grayness } put
fillprocs 23 { 0.000000 grayness } put
fillprocs 24 {<f0e1c3870f1e3c78> 8 1 setpattern } put
fillprocs 25 {<f0783c1e0f87c3e1> 8 1 setpattern } put
fillprocs 26 {<3333333333333333> 8 1 setpattern } put
fillprocs 27 {<0000ffff0000ffff> 8 1 setpattern } put
fillprocs 28 {<7ebddbe7e7dbbd7e> 8 1 setpattern } put
fillprocs 29 {<fcf9f3e7cf9f3f7e> 8 1 setpattern } put
fillprocs 30 {<7fbfdfeff7fbfdfe> 8 1 setpattern } put
fillprocs 31 {} put
%%EndSetup
0 9 /Times-Italic FMDEFINEFONT
1 9 /Times-Roman FMDEFINEFONT
2 18 /Times-Roman FMDEFINEFONT
3 16 /Times-Roman FMDEFINEFONT
4 10 /Times-Roman FMDEFINEFONT
5 11 /Times-Italic FMDEFINEFONT
6 8 /Times-Roman FMDEFINEFONT
7 10 /Times-Italic FMDEFINEFONT
8 9 /Times-Bold FMDEFINEFONT
9 8 /Courier-Bold FMDEFINEFONT
10 7 /Times-Roman FMDEFINEFONT
11 8 /Times-Italic FMDEFINEFONT
%%Page: "57" 1
%%BeginPaperSize: Letter
%%EndPaperSize
612 792 0 FMBEGINPAGE
108 175 468 648 R
7 X
0 K
V
0 F
0 X
(T) 113.82 642 T
(o be published in: LISP AND SYMBOLIC COMPUT) 117.99 642 T
(A) 306.81 642 T
(TION: An International Journal, 4, 3, 1991) 311.97 642 T
1 F
(\251) 204.62 633 T
0 F
( 1991 Kluwer Academic Publishers - Manufactur) 211.45 633 T
(ed in The Netherlands) 388.36 633 T
2 F
(An Efficient Implementation of ) 108 563.73 T
(S) 339.84 563.73 T
3 F
(ELF) 349.84 563.73 T
2 F
(,) 378.27 563.73 T
(a Dynamically-Typed Object-Oriented Language ) 108 543.56 T
(Based on Prototypes) 108 523.39 T
4 F
(*) 255.91 528.18 T
(CRAIG CHAMBERS) 108 467.97 T
(\050) 355.2 467.97 T
5 F
(craig@self.stanfor) 358.53 467.97 T
(d.edu) 440.57 467.97 T
4 F
(\051) 464.67 467.97 T
(DA) 108 452.25 T
(VID UNGAR) 121.14 452.25 T
6 F
(\240) 176.93 456.25 T
4 F
(\050) 352.15 452.25 T
5 F
(ungar@self.stanfor) 355.48 452.25 T
(d.edu) 440.57 452.25 T
4 F
(\051) 464.67 452.25 T
(ELGIN LEE) 108 436.53 T
6 F
(\340) 158.79 440.53 T
4 F
(\050) 373.23 436.53 T
5 F
(ehl@par) 376.56 436.53 T
(cplace.com) 414.95 436.53 T
4 F
(\051) 464.67 436.53 T
7 F
(Computer Systems Laboratory) 108 419.43 T
(, Stanfor) 229.6 419.43 T
(d University) 263.66 419.43 T
(, Stanfor) 312.25 419.43 T
(d, California 94305) 346.31 419.43 T
8 F
(Abstract.) 108 375.38 T
1 F
2.67 (W) 153 375.38 P
2.67 (e have developed and implemented techniques that double the performance of) 160.76 375.38 P
1.07 (dynamically-typed object-oriented languages. Our S) 108 365.38 P
6 F
0.95 (ELF) 300.25 365.38 P
1 F
1.07 ( implementation runs twice as fast as the) 314.46 365.38 P
(fastest Smalltalk implementation, despite S) 108 355.38 T
6 F
(ELF) 263.54 355.38 T
1 F
(\325) 277.75 355.38 T
(s lack of classes and explicit variables.) 280.25 355.38 T
2.89 (T) 114.64 343.38 P
2.89 (o compensate for the absence of classes, our system uses implementation-level ) 119.51 343.38 P
0 F
2.89 (maps) 436.89 343.38 P
1 F
2.89 ( to) 455.87 343.38 P
0.94 (transparently group objects cloned from the same prototype, providing data type information and) 108 333.38 P
0.65 (eliminating the apparent space overhead for prototype-based systems. T) 108 323.38 P
0.65 (o compensate for dynamic) 370.94 323.38 P
0.96 (typing, user) 108 313.38 P
0.96 (-de\336ned control structures, and the lack of explicit variables, our system dynamically) 151.21 313.38 P
1.11 (compiles ) 108 303.38 P
0 F
1.11 (multiple versions) 143.81 303.38 P
1 F
1.11 ( of a source method, each) 206.59 303.38 P
0 F
1.11 ( customized) 303.99 303.38 P
1 F
1.11 ( according to its receiver) 347.29 303.38 P
1.11 (\325) 440.92 303.38 P
1.11 (s map.) 443.42 303.38 P
0.55 (W) 108 293.38 P
0.55 (ithin each version the type of the receiver is \336xed, and thus the compiler can statically bind and) 116.12 293.38 P
0 F
0.85 (inline) 108 283.38 P
1 F
0.85 ( all messages sent to ) 128.47 283.38 P
9 F
1.82 (self) 208.36 283.38 P
1 F
0.85 (. ) 227.55 283.38 P
0 F
0.85 (Message splitting) 232.9 283.38 P
1 F
0.85 ( and ) 296.91 283.38 P
0 F
0.85 (type pr) 316.08 283.38 P
0.85 (ediction) 341.81 283.38 P
1 F
0.85 ( extract and preserve even) 370.77 283.38 P
2.54 (more static type information, allowing the compiler to inline many other messages. Inlining) 108 273.38 P
0.09 (dramatically improves performance and eliminates the need to hard-wire low-level methods such as) 108 263.38 P
9 F
(+) 108 253.38 T
1 F
(, ) 112.8 253.38 T
9 F
(=) 117.29 253.38 T
(=) 122.75 253.38 T
1 F
(, and ) 127.55 253.38 T
9 F
(ifTrue:) 147.27 253.38 T
1 F
(.) 180.85 253.38 T
2.51 (Despite inlining and other optimizations, our system still supports interactive programming) 114.64 241.38 P
1.18 (environments. The system traverses internal dependency lists to invalidate all compiled methods) 108 231.38 P
0.31 (af) 108 221.38 P
0.31 (fected by a programming change. The debugger reconstructs inlined stack frames from compiler) 114.82 221.38 P
0.31 (-) 465.01 221.38 P
(generated debugging information, making inlining invisible to the S) 108 211.38 T
6 F
(ELF) 352.4 211.38 T
1 F
( programmer) 366.62 211.38 T
(.) 412.8 211.38 T
108 89 468 174 R
7 X
V
0 X
0.79 (*) 117 156 P
0.79 (This work has been generously supported by National Science Foundation Presidential Y) 121.49 156 P
0.79 (oung) 450.02 156 P
1.7 (Investigator Grant #CCR-8657631, and by IBM, T) 108 146 P
1.7 (exas Instruments, NCR, T) 300.31 146 P
1.7 (andem Computers,) 398.4 146 P
(Apple Computer) 108 136 T
(, and Sun Microsystems) 167.8 136 T
(.) 254.18 136 T
10 F
(\240) 117 127.6 T
1 F
(Author\325s present address: Sun Microsystems, 2500 Garcia Avenue, Mountain View, CA 94043.) 120.49 124 T
10 F
-0.16 (\340) 117 115.6 P
1 F
-0.2 (Author\325s present address: ParcPlace Systems, 1550 Plymouth Street, Mountain View, CA 94043.) 120.49 112 P
6 F
-0.46 (This paper was originally published in ) 117 100.67 P
11 F
-0.46 (OOPSLA) 239.07 100.67 P
6 F
-0.46 ( ) 268.83 100.67 P
11 F
-0.46 (\32589 Confer) 270.37 100.67 P
-0.46 (ence Pr) 304.49 100.67 P
-0.46 (oceedings) 328.38 100.67 P
6 F
-0.46 ( \050) 360.35 100.67 P
11 F
-0.46 (SIGPLAN Notices) 364.56 100.67 P
6 F
-0.46 (, 25, 10 \0501989\051) 422.07 100.67 P
(49-70\051.) 108 92.67 T
108 167 252 167 2 L
7 X
V
0.5 H
2 Z
0 X
N
FMENDPAGE
%%EndPage: "57" 2
2 13 /Times-Bold FMDEFINEFONT
3 11 /Times-Roman FMDEFINEFONT
%%Page: "58" 2
612 792 0 FMBEGINPAGE
108 630 468 648 R
7 X
0 K
V
7 F
0 X
(58) 108 641.33 T
(CHAMBERS, UNGAR, AND LEE) 332.8 641.33 T
108 89 468 612 R
7 X
V
2 F
0 X
(1) 108 603.3 T
(Intr) 126 603.3 T
(oduction) 148.13 603.3 T
3 F
2.61 (S) 117 580.24 P
4 F
2.38 (ELF) 123.11 580.24 P
3 F
2.61 ( [32] is a dynamically-typed object-oriented language inspired by the) 140.88 580.24 P
2.67 (Smalltalk-80) 108 568.24 P
1 F
2.18 (1) 164.77 572.64 P
3 F
2.67 ( language [12]. Like Smalltalk, S) 169.26 568.24 P
4 F
2.43 (ELF) 328.17 568.24 P
3 F
2.67 ( has no type declarations,) 345.95 568.24 P
0.84 (allowing programmers to rapidly build and modify systems without interference) 108 556.24 P
0.52 (from out-of-date type declarations. Also, S) 108 544.24 P
4 F
0.47 (ELF) 298.86 544.24 P
3 F
0.52 ( provides ) 316.63 544.24 P
5 F
0.52 (blocks) 361 544.24 P
3 F
0.52 ( \050lexically-scoped) 389.07 544.24 P
0.47 (function objects akin to closures [24, 25]\051 so that S) 108 532.24 P
4 F
0.43 (ELF) 336.23 532.24 P
3 F
0.47 ( programmers may de\336ne) 354 532.24 P
0.3 (their own control structures; even the standard control structures for iteration and) 108 520.24 P
1.2 (boolean selection are constructed out of blocks. However) 108 508.24 P
1.2 (, unlike Smalltalk and) 367.97 508.24 P
0.12 (most other object-oriented languages, S) 108 496.24 P
4 F
0.11 (ELF) 282.72 496.24 P
3 F
0.12 ( has no classes.) 300.49 496.24 P
1 F
0.1 (2) 367.99 500.64 P
3 F
0.12 ( Instead it is based on) 372.48 496.24 P
1.03 (the ) 108 484.24 P
5 F
1.03 (pr) 125.2 484.24 P
1.03 (ototype object model) 134.56 484.24 P
3 F
1.03 (, in which each object de\336nes its own object-speci\336c) 228.16 484.24 P
0.23 (behavior) 108 472.24 P
0.23 (, and inherits shared behavior from its parent objects. Also unlike Small-) 146 472.24 P
-0.34 (talk, S) 108 460.24 P
4 F
-0.31 (ELF) 135.74 460.24 P
3 F
-0.34 ( accesses state solely by sending messages; there is no special syntax for) 153.51 460.24 P
1.63 (accessing a variable or changing its value. These two features, combined with) 108 448.24 P
1.82 (S) 108 436.24 P
4 F
1.65 (ELF) 114.11 436.24 P
3 F
1.82 (\325) 131.88 436.24 P
1.82 (s multiple inheritance rules, help keep programs concise, malleable, and) 134.93 436.24 P
(reusable.) 108 424.24 T
3.05 (In a straightforward implementation, S) 117 409.24 P
4 F
2.78 (ELF) 299.79 409.24 P
3 F
3.05 (\325) 317.56 409.24 P
3.05 (s prototype-based model would) 320.61 409.24 P
0.68 (consume much more storage space than other dynamically-typed object-oriented) 108 397.24 P
-0.28 (programming languages, and its reliance on message passing to access state would) 108 385.24 P
1.16 (exact an even higher penalty in execution time. W) 108 373.24 P
1.16 (e have developed and imple-) 337.03 373.24 P
-0.66 (mented techniques that eliminate the space and time costs of these features. In addi-) 108 361.24 P
0.73 (tion, we have implemented other optimizations that enable S) 108 349.24 P
4 F
0.66 (ELF) 380.2 349.24 P
3 F
0.73 ( to run twice as) 397.97 349.24 P
0.22 (fast as the fastest Smalltalk system. These same techniques could improve imple-) 108 337.24 P
1.63 (mentations of class-based object-oriented languages such as Smalltalk, Flavors) 108 325.24 P
([20], CLOS [3], C++ [27], T) 108 313.24 T
(rellis/Owl [23], and Eif) 233.52 313.24 T
(fel [19].) 335.85 313.24 T
0.42 (This paper describes our implementation for S) 117 298.24 P
4 F
0.38 (ELF) 323.32 298.24 P
3 F
0.42 (, which has been running for) 340.21 298.24 P
-0.1 (over a year) 108 286.24 P
-0.1 (. First we review S) 156.01 286.24 P
4 F
-0.09 (ELF) 238.31 286.24 P
3 F
-0.1 (\325) 256.08 286.24 P
-0.1 (s object and execution model in section 2. Then) 259.14 286.24 P
-0.61 (we describe S) 108 274.24 P
4 F
-0.56 (ELF) 167.79 274.24 P
3 F
-0.61 (\325) 185.56 274.24 P
-0.61 (s object storage system in section 3, introducing ) 188.62 274.24 P
5 F
-0.61 (maps) 397.63 274.24 P
3 F
-0.61 ( and ) 420.82 274.24 P
5 F
-0.61 (segr) 440.95 274.24 P
-0.61 (e-) 459.46 274.24 P
0.03 (gation) 108 262.24 P
3 F
0.03 ( and presenting object formats. Section 4 explains our byte-coded represen-) 136.08 262.24 P
2.5 (tation for source code. Section 5 reviews the compiler techniques, originally) 108 250.24 P
0.63 (published in [6]. Section 6 explains how these optimizations can coexist with an) 108 238.24 P
1.82 (exploratory programming environment that supports incremental recompilation) 108 226.24 P
0.6 (and source-level debugging. Section 7 compares the performance of S) 108 214.24 P
4 F
0.55 (ELF) 421.56 214.24 P
3 F
0.6 ( to the) 439.33 214.24 P
0.32 (fastest available Smalltalk system and an optimizing C compiler) 108 202.24 P
0.32 (. It also proposes) 392.57 202.24 P
0.49 (a new performance metric, ) 108 190.24 P
5 F
0.49 (MiMS) 230.47 190.24 P
3 F
0.49 (, for object-oriented language implementations.) 257.32 190.24 P
(W) 108 178.24 T
(e conclude with a discussion of open issues and future work.) 117.49 178.24 T
108 143 468 148.98 C
108 143 468 148.98 R
7 X
0 K
V
107.48 146.96 251.48 146.96 2 L
V
0.5 H
2 Z
0 X
N
0 0 612 792 C
10 F
0 X
0 K
0.08 (1) 117 140.6 P
1 F
0.1 (Smalltalk-80 is a trademark of ParcPlace Systems, Inc. Hereafter when we write \322Smalltalk\323 we) 120.49 137 P
(will be referring to the Smalltalk-80 system or language.) 108 127 T
10 F
0.01 (2) 117 118.6 P
1 F
0.02 (To illustrate how unusual this is, note that some well-respected authorities have gone so far as to) 120.49 115 P
0.19 (require that \322object-oriented\323 languages provide classes [32]. Other prototype models are discussed) 108 105 P
(in [4, 15, 17, 26].) 108 95 T
FMENDPAGE
%%EndPage: "58" 3
8 11 /Times-Bold FMDEFINEFONT
9 10 /Courier-Bold FMDEFINEFONT
%%Page: "59" 3
612 792 0 FMBEGINPAGE
108 630 468 648 R
7 X
0 K
V
7 F
0 X
(AN EFFICIENT IMPLEMENTATION OF S) 108 641.33 T
0 F
(ELF) 284.01 641.33 T
7 F
(59) 458.01 641.33 T
108 89 468 612 R
7 X
V
2 F
0 X
(2) 108 603.3 T
(Overview of S) 126 603.3 T
8 F
(ELF) 203.9 603.3 T
3 F
-0.28 (S) 117 580.24 P
4 F
-0.26 (ELF) 123.11 580.24 P
3 F
-0.28 ( was initially designed by the second author and Randall B. Smith at Xerox) 140.88 580.24 P
2.06 (P) 108 568.24 P
2.06 (ARC. The subsequent design evolution and implementation were undertaken) 113.1 568.24 P
(beginning in mid-1987 by the authors at Stanford University) 108 556.24 T
(.) 373.39 556.24 T
-0.14 (S) 117 541.24 P
4 F
-0.12 (ELF) 123.11 541.24 P
3 F
-0.14 ( objects consist of ) 140.88 541.24 P
5 F
-0.14 (named slots) 222.11 541.24 P
3 F
-0.14 (, each of which contains a reference to some) 274.16 541.24 P
-0.2 (other object. Some slots may be designated as) 108 529.24 P
5 F
-0.2 ( par) 308.6 529.24 P
-0.2 (ent) 325.99 529.24 P
3 F
-0.2 ( slots \050by appending asterisks) 339.42 529.24 P
-0.08 (to their names\051. Objects may also have S) 108 517.24 P
4 F
-0.07 (ELF) 286.86 517.24 P
3 F
-0.08 ( source code associated with them, in) 304.63 517.24 P
0.38 (which case the object is called a ) 108 505.24 P
5 F
0.38 (method) 254.33 505.24 P
3 F
0.38 ( \050similar to a procedure\051. T) 286.67 505.24 P
0.38 (o make a new) 406.16 505.24 P
-0.24 (object in S) 108 493.24 P
4 F
-0.21 (ELF) 154.53 493.24 P
3 F
-0.24 (, an existing object \050called the ) 171.42 493.24 P
5 F
-0.24 (pr) 304.57 493.24 P
-0.24 (ototype) 313.93 493.24 P
3 F
-0.24 (\051 is simply ) 346.27 493.24 P
5 F
-0.24 (cloned) 394.7 493.24 P
3 F
-0.24 ( \050shallow-) 423.99 493.24 P
(copied\051.) 108 481.24 T
1.06 (When a message is sent to an object \050called the ) 117 466.24 P
5 F
1.06 (r) 337.55 466.24 P
1.06 (eceiver) 341.42 466.24 P
3 F
1.06 ( of the message\051, the) 373.13 466.24 P
-0.06 (object is searched for a slot with the same name as the message. If a matching slot) 108 454.24 P
-0.11 (is not found, then the contents of the object\325) 108 442.24 P
-0.11 (s parent slots are searched recursively) 300.26 442.24 P
-0.11 (,) 465.25 442.24 P
1.03 (using S) 108 430.24 P
4 F
0.94 (ELF) 141.7 430.24 P
3 F
1.03 (\325) 159.47 430.24 P
1.03 (s multiple inheritance rules to disambiguate any duplicate matching) 162.52 430.24 P
1.43 (slots. Once a matching slot is found, its contents is ) 108 418.24 P
5 F
1.43 (evaluated) 347.54 418.24 P
3 F
1.43 ( and the result is) 390.26 418.24 P
(returned as the result of the message send.) 108 406.24 T
0.47 (An object without code evaluates to itself \050and so the slot holding it acts like a) 117 391.24 P
0.41 (variable\051. An object with code \050a method\051 is a prototype activation record. When) 108 379.24 P
-0.15 (evaluated, the method object clones itself, \336lls in its ) 108 367.24 P
9 F
-0.33 (self) 337.67 367.24 P
3 F
-0.15 ( slot with the receiver of) 361.65 367.24 P
0.02 (the message, \336lls in its ar) 108 355.24 P
0.02 (gument slots \050if any\051 with the ar) 219 355.24 P
0.02 (guments of the message,) 359.91 355.24 P
0.43 (and executes its code. The ) 108 343.24 P
9 F
0.94 (self) 228.53 343.24 P
3 F
0.43 ( slot is a parent slot so that the cloned activation) 252.52 343.24 P
(record inherits from the receiver of the message send.) 108 331.24 T
-0.68 (For instance, in the point example shown on the next page, sending the ) 117 316.24 P
9 F
-1.49 (x) 422.72 316.24 P
3 F
-0.68 ( message) 428.71 316.24 P
-0.32 (to the cartesian point object \336nds the ) 108 304.24 P
9 F
-0.69 (x) 270.25 304.24 P
3 F
-0.32 ( slot immediately) 276.25 304.24 P
-0.32 (. The contents of the slot is) 351.2 304.24 P
0.23 (the integer ) 108 292.24 P
9 F
0.5 (3) 157.89 292.24 P
3 F
0.23 (, which evaluates to itself \050it has no associated code\051, producing ) 163.88 292.24 P
9 F
0.5 (3) 449.88 292.24 P
3 F
0.23 ( as) 455.87 292.24 P
0.9 (the result of the ) 108 280.24 P
9 F
1.97 (x) 183.01 280.24 P
3 F
0.9 ( message. If ) 189.01 280.24 P
9 F
1.97 (x) 247.24 280.24 P
3 F
0.9 ( were sent to the polar point object, however) 253.24 280.24 P
0.9 (, ) 455.61 280.24 P
9 F
1.97 (x) 462 280.24 P
3 F
0.69 (wouldn\325) 108 268.24 P
0.69 (t be found immediately) 144.42 268.24 P
0.69 (. The object\325) 248.02 268.24 P
0.69 (s parents would be searched, \336nding) 304.64 268.24 P
-0.2 (the ) 108 256.24 P
9 F
-0.44 (x) 123.97 256.24 P
3 F
-0.2 ( slot de\336ned in the polar point traits object. That ) 129.97 256.24 P
9 F
-0.44 (x) 342.47 256.24 P
3 F
-0.2 ( slot contains a method that) 348.47 256.24 P
1.8 (computes the ) 108 244.24 P
9 F
3.93 (x) 172.63 244.24 P
3 F
1.8 ( coordinate from the ) 178.63 244.24 P
9 F
3.93 (rho) 277.98 244.24 P
3 F
1.8 ( and ) 295.97 244.24 P
9 F
3.93 (theta) 320.93 244.24 P
3 F
1.8 ( coordinates. The method) 350.92 244.24 P
(would get cloned and executed, producing the \337oating point result ) 108 232.24 T
9 F
(1.25) 401.85 232.24 T
3 F
(.) 425.84 232.24 T
0.24 (If the ) 117 217.24 P
9 F
0.52 (print) 143.71 217.24 P
3 F
0.24 ( message were sent to a point object, the ) 173.7 217.24 P
9 F
0.52 (print) 355.88 217.24 P
3 F
0.24 ( slot de\336ned in the) 385.86 217.24 P
0.06 (point traits object would be found. The method contained in the slot prints out the) 108 205.24 P
0.11 (point object in cartesian coordinates. If the point were represented using cartesian) 108 193.24 P
-0.36 (coordinates, the ) 108 181.24 P
9 F
-0.79 (x) 179.59 181.24 P
3 F
-0.36 ( and ) 185.58 181.24 P
9 F
-0.79 (y) 206.22 181.24 P
3 F
-0.36 ( messages would access the corresponding data slots of the) 212.21 181.24 P
0.37 (point object. But the ) 108 169.24 P
9 F
0.81 (print) 201.95 169.24 P
3 F
0.37 ( method works \336ne even for points represented using) 231.93 169.24 P
-0.65 (polar coordinates: the ) 108 157.24 P
9 F
-1.42 (x) 204 157.24 P
3 F
-0.65 ( and ) 209.99 157.24 P
9 F
-1.42 (y) 230.05 157.24 P
3 F
-0.65 ( messages would \336nd the conversion methods de\336ned) 236.05 157.24 P
(in the polar point traits object to compute the correct ) 108 145.24 T
9 F
(x) 341.73 145.24 T
3 F
( and ) 347.73 145.24 T
9 F
(y) 369.09 145.24 T
3 F
( values.) 375.08 145.24 T
0.36 (S) 117 130.24 P
4 F
0.33 (ELF) 123.11 130.24 P
3 F
0.36 ( supports assignments to data slots by associating an ) 140.88 130.24 P
5 F
0.36 (assignment slot) 376.94 130.24 P
3 F
0.36 ( with) 445.36 130.24 P
0.82 (each assignable data slot. The assignment slot contains the ) 108 118.24 P
5 F
0.82 (assignment primitive) 375.33 118.24 P
3 F
-0.4 (object. When the assignment primitive is evaluated as the result of a message send,) 108 106.24 P
4.28 (it stores its ar) 108 94.24 P
4.28 (gument into the associated data slot. A data slot with no) 179.54 94.24 P
FMENDPAGE
%%EndPage: "59" 4
12 10 /Times-Bold FMDEFINEFONT
13 10 /Symbol FMDEFINEFONT
14 8 /Helvetica FMDEFINEFONT
15 12 /Times-Bold FMDEFINEFONT
%%Page: "60" 4
612 792 0 FMBEGINPAGE
108 630 468 648 R
7 X
0 K
V
7 F
0 X
(60) 108 641.33 T
(CHAMBERS, UNGAR, AND LEE) 332.8 641.33 T
108 89 468 612 R
7 X
V
3 F
0 X
2.58 (corre) 108 215.37 P
2.58 (sponding assignment slot is called a ) 130.57 215.37 P
5 F
2.58 (constant ) 306.58 215.37 P
3 F
2.58 (or) 349.15 215.37 P
5 F
2.58 ( r) 358.3 215.37 P
2.58 (ead-only slot) 367.49 215.37 P
3 F
2.58 (, since a) 427.14 215.37 P
2.13 (running program cannot change its value. For example, most parent slots are) 108 203.37 P
-0.32 (constant slots. However) 108 191.37 P
-0.32 (, our object model allows a parent slot to be assignable just) 212.18 191.37 P
0.25 (like any other slot, simply by de\336ning its corresponding assignment slot. Such an) 108 179.37 P
-0.21 (assignable parent slot permits an object\325) 108 167.37 P
-0.21 (s inheritance to change on-the-\337y) 283.03 167.37 P
-0.21 (, perhaps) 428.55 167.37 P
0.47 (as a result of a change in the object\325) 108 155.37 P
0.47 (s state. For example, a collection object may) 269.15 155.37 P
-0.4 (wish to provide dif) 108 143.37 P
-0.4 (ferent behavior depending on whether the collection is empty or) 189.93 143.37 P
1.57 (not. This ) 108 131.37 P
5 F
1.57 (dynamic inheritance) 152.95 131.37 P
3 F
1.57 ( is one of S) 244.52 131.37 P
4 F
1.42 (ELF) 300.22 131.37 P
3 F
1.57 (\325) 317.99 131.37 P
1.57 (s linguistic innovations, and has) 321.05 131.37 P
1.52 (proven to be a useful addition to the set of object-oriented programming tech-) 108 119.37 P
(niques.) 108 107.37 T
108 89 468 612 C
111 222.7 465 612 C
111 222.7 465 612 R
7 X
0 K
V
185 458.34 289 503.34 R
3 X
V
0.5 H
0 Z
N
220 487.34 287 496.34 R
7 X
V
0 X
N
220 478.34 287 487.34 R
7 X
V
0 X
N
220 469.34 287 478.34 R
7 X
V
0 X
N
220 460.34 287 469.34 R
7 X
V
0 X
N
220 496.34 287 505.34 R
7 X
V
0 X
N
12 F
(. . .) 246.75 472.34 T
(. . .) 246.75 463.34 T
213 536.34 382 563.34 R
3 X
V
1 H
N
247 538.34 380 547.34 R
7 X
V
0.5 H
0 X
N
247 556.34 380 565.34 R
7 X
V
0 X
N
263 585.34 335 594.34 R
3 X
V
1 H
N
311 386.34 383 431.34 R
V
0.5 H
N
129 244.68 443.34 371.34 R
7 X
V
4 F
0 X
0.85 (Six S) 129 364.67 P
1 F
0.77 (ELF) 151.24 364.67 P
4 F
0.85 ( objects. The bottom objects are two-dimensional point objects, the) 167.22 364.67 P
0.47 (left one using cartesian coordinates and the right one using polar coordinates.) 129 353.67 P
1.83 (The ) 129 342.67 P
13 F
1.83 (\254) 148.87 342.67 P
4 F
1.83 ( represents the assignment primitive operation, which is invoked to) 158.73 342.67 P
-0.6 (modify the contents of corresponding data slots. The cartesian point traits object) 129 331.67 P
-0.15 (is the immediate parent object shared by all cartesian point objects, and de\336nes) 129 320.67 P
-0.17 (four methods for interpreting cartesian points in terms of polar coordinates; the) 129 309.67 P
0.43 (polar point traits object does the same for polar point objects. The point traits) 129 298.67 P
-0.03 (object is a shared ancestor of all point objects, and de\336nes general methods for) 129 287.67 P
-0.44 (printing and adding points, regardless of coordinate system. This object inherits) 129 276.67 P
0.02 (from the top object, which de\336nes even more general behavior) 129 265.67 P
0.02 (, such as how to) 379.13 265.67 P
(copy objects.) 129 254.67 T
309 388.34 346 397.34 R
7 X
V
0 X
N
309 424.34 346 433.34 R
7 X
V
0 X
N
14 F
(parent*) 317.11 426.34 T
309 415.34 346 424.34 R
7 X
V
0 X
N
309 406.34 346 415.34 R
7 X
V
0 X
N
(rho) 323.22 416.34 T
(theta) 320.11 407.34 T
309 397.34 346 406.34 R
7 X
V
0 X
N
(rho:) 322.11 398.34 T
(theta:) 319 389.34 T
346 388.34 381 397.34 R
7 X
V
0 X
N
346 424.34 381 433.34 R
7 X
V
0 X
N
346 415.34 381 424.34 R
7 X
V
0 X
N
346 406.34 381 415.34 R
7 X
V
0 X
N
346 397.34 381 406.34 R
7 X
V
0 X
N
13 F
(\254) 359.07 390.34 T
14 F
(2.5) 358.44 416.34 T
(60) 359.55 407.34 T
13 F
(\254) 359.07 398.34 T
183 460.34 220 469.34 R
7 X
V
0 X
N
183 496.34 220 505.34 R
7 X
V
0 X
N
14 F
(parent*) 191.11 498.34 T
183 487.34 220 496.34 R
7 X
V
0 X
N
183 478.34 220 487.34 R
7 X
V
0 X
N
(rho) 197.22 488.34 T
(theta) 194.11 479.34 T
183 469.34 220 478.34 R
7 X
V
0 X
N
(rho:) 196.11 470.34 T
(theta:) 193 461.34 T
210 547.34 247 556.34 R
7 X
V
0 X
N
210 538.34 247 547.34 R
7 X
V
0 X
N
(print) 220.22 548.34 T
(+) 225.66 539.34 T
247 547.34 380 556.34 R
7 X
V
0 X
N
210 556.34 247 565.34 R
7 X
V
0 X
N
(parent*) 218.11 558.34 T
208 386.34 280 431.34 R
3 X
V
N
206 388.34 243 397.34 R
7 X
V
0 X
N
206 424.34 243 433.34 R
7 X
V
0 X
N
(parent*) 214.11 426.34 T
206 415.34 243 424.34 R
7 X
V
0 X
N
206 406.34 243 415.34 R
7 X
V
0 X
N
(x) 224 416.34 T
(y) 224 408.34 T
206 397.34 243 406.34 R
7 X
V
0 X
N
(x:) 222.89 398.34 T
(y:) 222.89 390.34 T
243 388.34 278 397.34 R
7 X
V
0 X
N
243 424.34 278 433.34 R
7 X
V
0 X
N
243 415.34 278 424.34 R
7 X
V
0 X
N
243 406.34 278 415.34 R
7 X
V
0 X
N
243 397.34 278 406.34 R
7 X
V
0 X
N
13 F
(\254) 256.07 390.34 T
14 F
(3) 258.78 416.34 T
(4) 258.78 407.34 T
13 F
(\254) 256.07 398.34 T
15 F
(. . .) 290.5 591.34 T
297 578.87 299 582.34 301 578.87 3 L
1 H
N
299 560.34 299 582.34 2 L
7 X
V
2 Z
0 X
N
299 458.34 398 503.34 R
3 X
V
0.5 H
0 Z
N
297 460.34 334 469.34 R
7 X
V
0 X
N
297 496.34 334 505.34 R
7 X
V
0 X
N
14 F
(parent*) 305.11 498.34 T
297 487.34 334 496.34 R
7 X
V
0 X
N
297 478.34 334 487.34 R
7 X
V
0 X
N
(x) 315 488.34 T
(y) 315 480.34 T
297 469.34 334 478.34 R
7 X
V
0 X
N
(x:) 313.89 470.34 T
(y:) 313.89 462.34 T
334 460.34 396 469.34 R
7 X
V
0 X
N
334 496.34 396 505.34 R
7 X
V
0 X
N
334 487.34 396 496.34 R
7 X
V
0 X
N
334 478.34 396 487.34 R
7 X
V
0 X
N
334 469.34 396 478.34 R
7 X
V
0 X
N
12 F
(. . .) 358.75 472.34 T
(. . .) 358.75 463.34 T
259 451.87 261 455.34 263 451.87 3 L
1 H
N
261 428.34 261 455.34 2 L
7 X
V
2 Z
0 X
N
362 451.87 364 455.34 366 451.87 3 L
0 Z
N
364 428.34 364 455.34 2 L
7 X
V
2 Z
0 X
N
261 587.34 298 596.34 R
7 X
V
0.5 H
0 Z
0 X
N
14 F
(clone) 270.45 588.34 T
298 587.34 333 596.34 R
7 X
V
0 X
N
12 F
(. . .) 310.75 590.34 T
14 F
(a cartesian point) 196 438.34 T
(a polar point) 305 438.34 T
(cartesian point traits) 178 511.34 T
(polar point traits) 294 511.34 T
(point traits) 203 569.34 T
(general traits) 252 601.34 T
(rho * theta cos) 339.22 488.34 T
258 529.87 260 533.34 262 529.87 3 L
1 H
N
260 500.34 260 533.34 2 L
7 X
V
2 Z
0 X
N
(rho * theta sin) 340.33 479.34 T
(\050x*x + y*y\051 sqrt) 226.9 488.34 T
(\050y / x\051 arctan) 230.78 479.34 T
(x print.  \325, \325 print.  y print) 271.67 549.34 T
(\050clone  x:  x + arg x\051  y:  y + arg y) 254.78 540.34 T
362 529.87 364 533.34 366 529.87 3 L
0 Z
N
364 500.34 364 533.34 2 L
7 X
V
2 Z
0 X
N
108 89 468 612 C
0 0 612 792 C
108 237 468 237 2 L
0.5 H
2 Z
0 X
0 K
N
FMENDPAGE
%%EndPage: "60" 5
%%Page: "61" 5
612 792 0 FMBEGINPAGE
108 630 468 648 R
7 X
0 K
V
7 F
0 X
(AN EFFICIENT IMPLEMENTATION OF S) 108 641.33 T
0 F
(ELF) 284.01 641.33 T
7 F
(61) 458.01 641.33 T
108 89 468 612 R
7 X
V
3 F
0 X
-0.17 (S) 117 604.67 P
4 F
-0.15 (ELF) 123.11 604.67 P
3 F
-0.17 ( allows programmers to de\336ne their own control structures using blocks. A) 140.88 604.67 P
5 F
-0.44 (block) 108 592.67 P
3 F
-0.44 ( contains a method in a slot named ) 131.8 592.67 P
9 F
-0.96 (value) 283.31 592.67 P
3 F
-0.44 (; this method is special in that when) 313.29 592.67 P
-0.48 (it is invoked \050by sending ) 108 580.67 P
9 F
-1.04 (value) 217.01 580.67 P
3 F
-0.48 ( to the block\051, the method runs as a child of its lexi-) 246.99 580.67 P
0.49 (cally enclosing activation record \050either a \322normal\323 method activation or another) 108 568.67 P
1.12 (block method activation\051. The ) 108 556.67 P
9 F
2.45 (self) 247.66 556.67 P
3 F
1.12 ( slot is not rebound when invoking a block) 271.65 556.67 P
2.86 (method, but instead is inherited from the lexically enclosing method. Block) 108 544.67 P
0.98 (methods may be terminated with a ) 108 532.67 P
5 F
0.98 (non-local r) 268.25 532.67 P
0.98 (eturn) 317.95 532.67 P
3 F
0.98 ( expression, which returns a) 341.14 532.67 P
1.83 (value not to the caller of the block method, but to the caller of the lexically-) 108 520.67 P
(enclosing non-block method, much like a ) 108 508.67 T
9 F
(return) 292.61 508.67 T
3 F
( statement in C.) 328.59 508.67 T
-0.26 (T) 117 493.67 P
-0.26 (wo other kinds of objects appear in S) 122.94 493.67 P
4 F
-0.24 (ELF) 284.33 493.67 P
3 F
-0.26 (: object arrays and byte arrays. Arrays) 302.1 493.67 P
-0.2 (contain only a single parent slot pointing to the parent object for that kind of array) 108 481.67 P
-0.2 (,) 465.25 481.67 P
0.5 (but contain a variable number of element objects. As their names suggest, object) 108 469.67 P
0.72 (arrays contain elements that are arbitrary objects, while byte arrays contain only) 108 457.67 P
0.14 (integer objects in the range 0 to 255, but in a more compact form. Primitive oper-) 108 445.67 P
0.56 (ations support fetching and storing elements of arrays as well as determining the) 108 433.67 P
(size of an array and cloning a new array of a particular size.) 108 421.67 T
0.2 (The S) 117 406.67 P
4 F
0.18 (ELF) 143.14 406.67 P
3 F
0.2 ( language described here is both simple and powerful, but resists ef) 160.91 406.67 P
0.2 (\336-) 458.23 406.67 P
1.14 (cient implementation. S) 108 394.67 P
4 F
1.04 (ELF) 214.97 394.67 P
3 F
1.14 (\325) 232.74 394.67 P
1.14 (s prototype object model, in which each object can) 235.79 394.67 P
1.72 (have unique format and behavior) 108 382.67 P
1.72 (, poses serious challenges for the economical) 259.67 382.67 P
2.34 (storage of objects. S) 108 370.67 P
4 F
2.12 (ELF) 204.1 370.67 P
3 F
2.34 (\325) 221.88 370.67 P
2.34 (s exclusion of type declarations and commitment to) 224.93 370.67 P
1.86 (message passing for all computation\321even for control structures and variable) 108 358.67 P
2.87 (accesses\321defeats existing compiler technology) 108 346.67 P
2.87 (. The remainder of this paper) 326.12 346.67 P
(describes our responses to these challenges.) 108 334.67 T
2 F
(3) 108 301.3 T
(The Object Storage System) 126 301.3 T
3 F
-0.45 (The object storage system \050also referred to as the ) 117 278.24 P
5 F
-0.45 (memory system) 331.13 278.24 P
3 F
-0.45 (\051 must represent) 398.11 278.24 P
1.87 (the objects of the S) 108 266.24 P
4 F
1.7 (ELF) 199.69 266.24 P
3 F
1.87 ( user) 217.46 266.24 P
1.87 (\325) 240.78 266.24 P
1.87 (s world, including references between objects. It) 243.84 266.24 P
0.21 (creates new objects and reclaims the resources consumed by inaccessible objects.) 108 254.24 P
0.25 (An ideal memory system would squeeze as many objects into as little memory as) 108 242.24 P
-0.41 (possible, for high performance at low cost. An earlier version of our S) 108 230.24 P
4 F
-0.37 (ELF) 411.27 230.24 P
3 F
-0.41 ( memory) 429.04 230.24 P
(system was documented in [16].) 108 218.24 T
-0.47 (Much of our memory system design exploits technology proven in existing high-) 117 203.24 P
0.85 (performance Smalltalk systems. For minimal overhead in the common case, our) 108 191.24 P
0.08 (S) 108 179.24 P
4 F
0.07 (ELF) 114.11 179.24 P
3 F
0.08 ( system represents object references using direct tagged pointers, rather than) 131.88 179.24 P
0.43 (indirectly through an object table. Allocation and garbage collection in our S) 108 167.24 P
4 F
0.39 (ELF) 450.23 167.24 P
3 F
5.59 (system uses Generation Scavenging with demographic feedback-mediated) 108 155.24 P
2.88 (tenuring [29, 30], augmented with a traditional mark-and-sweep collector to) 108 143.24 P
1.07 (reclaim tenured garbage. The following two subsections describe our new tech-) 108 131.24 P
-0.62 (niques for ef) 108 119.24 P
-0.62 (\336cient object storage systems; the third subsection describes our object) 162.08 119.24 P
(formats in detail.) 108 107.24 T
FMENDPAGE
%%EndPage: "61" 6
%%Page: "62" 6
612 792 0 FMBEGINPAGE
108 630 468 648 R
7 X
0 K
V
7 F
0 X
(62) 108 641.33 T
(CHAMBERS, UNGAR, AND LEE) 332.8 641.33 T
108 89 468 612 R
7 X
V
8 F
0 X
(3.1) 108 604.64 T
(Maps) 135 604.64 T
3 F
-0.33 (A naive implementation of S) 117 586 P
4 F
-0.3 (ELF) 242.62 586 P
3 F
-0.33 (\325) 260.39 586 P
-0.33 (s prototype object model would waste space. If) 263.45 586 P
-0.48 (S) 108 574 P
4 F
-0.44 (ELF) 114.11 574 P
3 F
-0.48 ( were based on classes, the class objects would contain the format \050names and) 131.88 574 P
1.15 (locations of the instance variables\051, methods, and superclass information for all) 108 562 P
0.25 (their instances; the instances would contain only the values of their instance vari-) 108 550 P
-0.53 (ables and a pointer to the shared class object. Since S) 108 538 P
4 F
-0.48 (ELF) 336.71 538 P
3 F
-0.53 ( uses the prototype model,) 354.48 538 P
-0.19 (each object must de\336ne its own format, behavior) 108 526 P
-0.19 (, and inheritance, and presumably) 320.46 526 P
-0.42 (an implementation would have to represent both the class-like format, method, and) 108 514 P
2.33 (inheritance information and the instance-like state information in ) 108 502 P
5 F
2.33 (every) 415.26 502 P
3 F
2.33 ( S) 439.05 502 P
4 F
2.12 (ELF) 450.23 502 P
3 F
(object.) 108 490 T
-0.35 (Luckily) 117 475 P
-0.35 (, we can regain the storage ef) 150.46 475 P
-0.35 (\336ciency of classes even in S) 276.58 475 P
4 F
-0.32 (ELF) 398.4 475 P
3 F
-0.35 (\325) 416.17 475 P
-0.35 (s prototype) 419.22 475 P
0.18 (object model. Few S) 108 463 P
4 F
0.16 (ELF) 198.87 463 P
3 F
0.18 ( objects have totally unique format and behavior) 216.64 463 P
0.18 (. Almost) 429.97 463 P
-0.12 (all objects are created by cloning some other object and then modifying the values) 108 451 P
-0.54 (of the assignable slots. Wholesale changes in the format or inheritance of an object,) 108 439 P
0.26 (such as those induced by the programmer) 108 427 P
0.26 (, can only be accomplished by invoking) 291.59 427 P
-0.29 (special primitives. W) 108 415 P
-0.29 (e say that a prototype and the objects cloned from it, identical) 200.22 415 P
(in every way except for the values of their assignable slots, form a ) 108 403 T
5 F
(clone family) 402.13 403 T
3 F
(.) 455.42 403 T
0.3 (W) 117 388 P
0.3 (e have invented ) 126.49 388 P
5 F
0.3 (maps) 199.1 388 P
3 F
0.3 ( as an implementation technique to ef) 222.29 388 P
0.3 (\336ciently represent) 388.67 388 P
0.4 (members of a clone family) 108 376 P
0.4 (. In our S) 226.66 376 P
4 F
0.36 (ELF) 268.75 376 P
3 F
0.4 ( object storage system, objects are repre-) 286.52 376 P
0.51 (sented by the values of their assignable slots, if any) 108 364 P
0.51 (, and a pointer to the object\325) 337.69 364 P
0.51 (s) 463.73 364 P
0.25 (map; the map is shared by all members of the same clone family) 108 352 P
0.25 (. For each slot in) 393.45 352 P
0.17 (the object, the map contains the name of the slot, whether the slot is a parent slot,) 108 340 P
0.84 (and either the of) 108 328 P
0.84 (fset within the object of the slot\325) 182.01 328 P
0.84 (s contents \050if it\325) 329.24 328 P
0.84 (s an assignable) 400.42 328 P
0.98 (slot\051 or the slot\325) 108 316 P
0.98 (s contents itself \050if it\325) 180.2 316 P
0.98 (s a constant slot, such as a non-assignable) 277.49 316 P
0.1 (parent slot\051. If the object has code \050i.e., is a method\051, the map stores a pointer to a) 108 304 P
1.72 (S) 108 292 P
4 F
1.57 (ELF) 114.11 292 P
3 F
1.72 ( byte code object representing the source code of the method \050byte code) 131.88 292 P
(objects are described in section 4\051.) 108 280 T
0.88 (Maps are immutable so that they may be freely shared by objects in the same) 117 265 P
-0.14 (clone family) 108 253 P
-0.14 (. However) 162.38 253 P
-0.14 (, when the user changes the format of an object or the value) 207.56 253 P
-0.08 (of one of an object\325) 108 241 P
-0.08 (s constant slots, the map no longer applies to the object. In this) 193.1 241 P
-0.28 (case, a new map is created for the changed object, starting a new clone family) 108 229 P
-0.28 (. The) 445.7 229 P
(old map still applies to any other members of the original clone family) 108 217 T
(.) 417.32 217 T
2.43 (From the implementation point of view) 117 202 P
2.43 (, maps look much like classes, and) 301.46 202 P
-0.24 (achieve the same sorts of space savings for shared data. But maps are totally trans-) 108 190 P
-0.34 (parent at the S) 108 178 P
4 F
-0.31 (ELF) 170.13 178 P
3 F
-0.34 ( language level, simplifying the language and increasing expres-) 187.9 178 P
-0.4 (sive power by allowing objects to change their formats at will. In addition, the map) 108 166 P
0.18 (of an object conveys its static properties to the S) 108 154 P
4 F
0.16 (ELF) 322.27 154 P
3 F
0.18 ( compiler) 340.04 154 P
0.18 (. Section 5 explains) 381.42 154 P
(how the compiler can exploit this information to optimize S) 108 142 T
4 F
(ELF) 370.75 142 T
3 F
( code.) 388.52 142 T
FMENDPAGE
%%EndPage: "62" 7
15 10 /Helvetica-Bold FMDEFINEFONT
%%Page: "63" 7
612 792 0 FMBEGINPAGE
108 630 468 648 R
7 X
0 K
V
7 F
0 X
(AN EFFICIENT IMPLEMENTATION OF S) 108 641.33 T
0 F
(ELF) 284.01 641.33 T
7 F
(63) 458.01 641.33 T
108 89 468 612 R
7 X
V
108 89 468 612 C
115.69 90 460.31 612 C
289.31 377 289.31 234 2 L
3 H
2 Z
3 X
0 K
N
210.31 336 247.31 345 R
V
0.5 H
0 Z
N
188.31 257 225.31 284 R
V
1 H
N
148.5 103 427.5 213 R
7 X
V
4 F
0 X
0.75 (An example of the representations for two cartesian points and their) 148.5 206.33 P
-0.01 (parent. W) 148.5 195.33 P
-0.01 (ithout maps, each slot would require at least two words: one) 187.5 195.33 P
0.65 (for its name and another for its contents. This means that each point) 148.5 184.33 P
1 (would occupy at least 10 words. W) 148.5 173.33 P
1 (ith maps, each point object only) 294.82 173.33 P
0.09 (needs to store the contents of its assignable slots, plus one more word) 148.5 162.33 P
0.51 (to point to the map. All constant slots and all format information are) 148.5 151.33 P
0.92 (factored out into the map. Maps reduce the 10 words per point to 3) 148.5 140.33 P
-0.55 (words. Since the cartesian point traits object has no assignable slots, all) 148.5 129.33 P
(of its data are kept in its map.) 148.5 118.33 T
256.31 511 328.31 556 R
3 X
V
0.5 H
N
254.31 513 291.31 522 R
7 X
V
0 X
N
254.31 549 291.31 558 R
7 X
V
0 X
N
14 F
(parent*) 262.42 551 T
254.31 540 291.31 549 R
7 X
V
0 X
N
254.31 531 291.31 540 R
7 X
V
0 X
N
(rho) 268.54 541 T
(theta) 265.42 532 T
254.31 522 291.31 531 R
7 X
V
0 X
N
(rho:) 267.42 523 T
(theta:) 264.31 514 T
291.31 513 326.31 522 R
7 X
V
0 X
N
291.31 549 326.31 558 R
7 X
V
0 X
N
291.31 540 326.31 549 R
7 X
V
0 X
N
291.31 531 326.31 540 R
7 X
V
0 X
N
291.31 522 326.31 531 R
7 X
V
0 X
N
12 F
(. . .) 302.07 543 T
(. . .) 302.07 534 T
(. . .) 302.07 525 T
(. . .) 302.07 516 T
213.31 441 285.31 486 R
3 X
V
N
211.31 443 248.31 452 R
7 X
V
0 X
N
211.31 479 248.31 488 R
7 X
V
0 X
N
14 F
(parent*) 219.42 481 T
211.31 470 248.31 479 R
7 X
V
0 X
N
211.31 461 248.31 470 R
7 X
V
0 X
N
(x) 229.31 471 T
(y) 229.31 463 T
211.31 452 248.31 461 R
7 X
V
0 X
N
(x:) 228.2 453 T
(y:) 228.2 445 T
248.31 443 283.31 452 R
7 X
V
0 X
N
248.31 479 283.31 488 R
7 X
V
0 X
N
248.31 470 283.31 479 R
7 X
V
0 X
N
248.31 461 283.31 470 R
7 X
V
0 X
N
248.31 452 283.31 461 R
7 X
V
0 X
N
13 F
(\254) 261.38 445 T
14 F
(3) 264.09 471 T
(4) 264.09 462 T
13 F
(\254) 261.38 453 T
263.31 506.54 265.31 510 267.31 506.54 3 L
1 H
N
265.31 483 265.31 510 2 L
7 X
V
2 Z
0 X
N
295.31 431 367.31 476 R
3 X
V
0.5 H
0 Z
N
293.31 433 330.31 442 R
7 X
V
0 X
N
293.31 469 330.31 478 R
7 X
V
0 X
N
14 F
(parent*) 301.42 471 T
293.31 460 330.31 469 R
7 X
V
0 X
N
293.31 451 330.31 460 R
7 X
V
0 X
N
(x) 311.31 461 T
(y) 311.31 453 T
293.31 442 330.31 451 R
7 X
V
0 X
N
(x:) 310.2 443 T
(y:) 310.2 435 T
330.31 433 365.31 442 R
7 X
V
0 X
N
330.31 469 365.31 478 R
7 X
V
0 X
N
330.31 460 365.31 469 R
7 X
V
0 X
N
330.31 451 365.31 460 R
7 X
V
0 X
N
330.31 442 365.31 451 R
7 X
V
0 X
N
13 F
(\254) 343.38 435 T
14 F
(7.5) 342.76 461 T
13 F
(\254) 343.38 443 T
348.31 474 348.31 527 2 L
7 X
V
1 H
2 Z
0 X
N
0 90 7 7 341.31 527 A
332.78 532 329.31 534 332.78 536 3 L
0 Z
N
341.31 534 329.31 534 2 L
2 Z
N
312.31 318 384.31 363 R
3 X
V
0.5 H
0 Z
N
310.31 320 347.31 329 R
7 X
V
0 X
N
310.31 356 347.31 365 R
7 X
V
0 X
N
14 F
(parent*) 318.42 358 T
310.31 347 347.31 356 R
7 X
V
0 X
N
310.31 338 347.31 347 R
7 X
V
0 X
N
(rho) 324.54 348 T
(theta) 321.42 339 T
310.31 329 347.31 338 R
7 X
V
0 X
N
(rho:) 323.42 330 T
(theta:) 320.31 321 T
347.31 320 382.31 329 R
7 X
V
0 X
N
347.31 356 382.31 365 R
7 X
V
0 X
N
347.31 347 382.31 356 R
7 X
V
0 X
N
347.31 338 382.31 347 R
7 X
V
0 X
N
347.31 329 382.31 338 R
7 X
V
0 X
N
12 F
(. . .) 358.07 350 T
(. . .) 358.07 341 T
(. . .) 358.07 332 T
(. . .) 358.07 323 T
186.31 277 223.31 286 R
7 X
V
0 X
N
186.31 268 223.31 277 R
7 X
V
0 X
N
186.31 259 223.31 268 R
7 X
V
0 X
N
14 F
(3) 204.09 269 T
(4) 204.09 260 T
225.31 330.54 227.31 334 229.31 330.54 3 L
1 H
N
227.31 317 227.31 334 2 L
7 X
V
2 Z
0 X
N
312.31 248 384.31 293 R
3 X
V
0.5 H
0 Z
N
310.31 250 347.31 259 R
7 X
V
0 X
N
310.31 286 347.31 295 R
7 X
V
0 X
N
(parent*) 318.42 288 T
310.31 277 347.31 286 R
7 X
V
0 X
N
310.31 268 347.31 277 R
7 X
V
0 X
N
(x) 328.31 278 T
(y) 328.31 270 T
310.31 259 347.31 268 R
7 X
V
0 X
N
(x:) 327.2 260 T
(y:) 327.2 252 T
347.31 250 382.31 259 R
7 X
V
0 X
N
347.31 286 382.31 295 R
7 X
V
0 X
N
347.31 277 382.31 286 R
7 X
V
0 X
N
347.31 268 382.31 277 R
7 X
V
0 X
N
347.31 259 382.31 268 R
7 X
V
0 X
N
13 F
(\254) 360.38 252 T
14 F
(offset 1) 352.2 278 T
(offset 2) 352.2 269 T
13 F
(\254) 360.38 260 T
363.31 300 363.31 291 2 L
7 X
V
1 H
2 Z
0 X
N
0 90 7 7 356.31 299 A
233.31 248 270.31 275 R
3 X
V
0 Z
N
231.31 268 268.31 277 R
7 X
V
0.5 H
0 X
N
231.31 259 268.31 268 R
7 X
V
0 X
N
231.31 250 268.31 259 R
7 X
V
0 X
N
14 F
(7.5) 245.76 260 T
(-24) 244.54 251 T
12 F
(. . .) 302.07 552 T
(. . .) 358.07 359 T
303.85 274 307.31 272 303.85 270 3 L
N
249.31 272 307.31 272 2 L
7 X
V
2 Z
0 X
N
303.85 283 307.31 281 303.85 279 3 L
0 Z
N
205.31 281 307.31 281 2 L
7 X
V
2 Z
0 X
N
208.31 338 245.31 347 R
7 X
V
0 Z
0 X
N
302.85 344 306.31 342 302.85 340 3 L
N
227.31 342 306.31 342 2 L
7 X
V
2 Z
0 X
N
356.31 306 237.31 306 2 L
7 X
V
1 H
0 X
N
14 F
(cartesian point traits) 255.54 564 T
(cartesian point traits map) 302.65 371 T
(cartesian point traits) 191.54 353 T
(two cartesian points) 192.98 236 T
(two cartesian points) 255.98 418 T
(cartesian point map) 312.43 239 T
15 F
(Without Maps) 256.55 579 T
(With Maps) 264.33 388 T
182.31 407 397.31 407 2 L
7 X
V
0 X
N
14 F
(-24) 341.54 452 T
180 270 10 12 237.31 318 A
108 89 468 612 C
0 0 612 792 C
FMENDPAGE
%%EndPage: "63" 8
13 9 /Helvetica FMDEFINEFONT
16 9 /Helvetica-Bold FMDEFINEFONT
%%Page: "64" 8
612 792 0 FMBEGINPAGE
108 630 468 648 R
7 X
0 K
V
7 F
0 X
(64) 108 641.33 T
(CHAMBERS, UNGAR, AND LEE) 332.8 641.33 T
108 89 468 612 R
7 X
V
8 F
0 X
(3.2) 108 604.64 T
(Segr) 135 604.64 T
(egation) 156.16 604.64 T
3 F
0.5 (A common operation of the memory system is to scan all object references for) 117 590 P
(those that meet some criterion:) 108 578 T
(\245) 117 563 T
(The scavenger scans all objects for references to objects in from-space.) 126 563 T
(\245) 117 550 T
-0.68 (The re\337ective object modi\336cation and programming primitives have to redirect) 126 550 P
(all references to an object if its size changes and it has to be moved.) 126 539 T
(\245) 117 527 T
0.11 (The browser may want to scan all objects for those that contain a reference to) 126 527 P
(a particular object that interests the S) 126 516 T
1 F
(ELF) 288.94 516 T
3 F
( user) 304.92 516 T
(.) 325.36 516 T
-0.11 (T) 108 502 P
-0.11 (o support these and other functions, our S) 113.94 502 P
4 F
-0.1 (ELF) 296.27 502 P
3 F
-0.11 ( implementation has been designed) 314.04 502 P
(for rapid scanning of object references.) 108 490 T
-0.04 (Since the elements of byte arrays are represented using packed bytes rather than) 117 475 P
-0.43 (tagged words, byte array elements may masquerade as object references. Smalltalk) 108 463.25 P
-0.43 (systems typically handle this problem by scanning the heap object-by-object rather) 108 451.5 P
0.41 (than word-by-word. For each object, the system checks to see whether the object) 108 439.75 P
0.58 (contains object references or only bytes. Only if the object contains object refer-) 108 428 P
0.37 (ences does the system scan the object for matching references, iterating up to the) 108 416.25 P
0.16 (length of the object. Then the scanner proceeds to the next object. This procedure) 108 404.5 P
-0.24 (avoids the problems caused by scanning byte arrays, but slows down the scan with) 108 392.75 P
(the overhead to parse object headers and compute object lengths.) 108 381 T
-0.33 (In our S) 117 366.25 P
4 F
-0.3 (ELF) 151.74 366.25 P
3 F
-0.33 ( system, we avoid the problems associated with scanning byte arrays) 169.51 366.25 P
1.5 (without degrading the object reference scanning speed by ) 108 354.5 P
5 F
1.5 (segr) 375.69 354.5 P
1.5 (egating) 394.2 354.5 P
3 F
1.5 ( the byte) 427.16 354.5 P
-0.23 (arrays from the other S) 108 342.75 P
4 F
-0.21 (ELF) 208.37 342.75 P
3 F
-0.23 ( objects. Each Generation Scavenging memory space is) 226.14 342.75 P
0.05 (divided into two areas, one for byte arrays and one for objects with references. T) 108 331 P
0.05 (o) 462.51 331 P
-0.02 (scan all object references, only the object reference area of each space needs to be) 108 319.25 P
-0.03 (scanned. This optimization speeds scans in two ways: byte array objects are never) 108 307.5 P
(scanned, and object headers are never parsed.) 108 295.75 T
108 89 468 612 C
168 90.75 408 292.08 C
168 90.75 408 292.08 R
7 X
0 K
V
286 188.66 288 192.12 290 188.66 3 L
1 H
0 Z
0 X
N
288 160.12 288 192.12 2 L
7 X
V
2 Z
0 X
N
180 115.12 397 174.12 R
4 X
V
0.5 H
0 Z
N
210 128.12 366 159.12 R
7 X
V
290 207.59 288 204.12 286 207.59 3 L
1 H
0 X
N
288 233.12 288 204.12 2 L
7 X
V
2 Z
0 X
N
180 221.12 396 273.12 R
5 X
V
0.5 H
0 Z
N
180 115.12 397 274.12 R
0.1 H
0 X
N
227 230.12 350 262.12 R
7 X
V
13 F
0 X
(bytes area grows downward;) 231 251.12 T
(contains all byte arrays but) 231 242.12 T
(no object references) 231 234.12 T
15 F
(A S) 234.52 95.12 T
16 F
(ELF) 251.18 95.12 T
15 F
( Memory Space) 268.16 95.12 T
13 F
(object reference area grows upward;) 213 149.12 T
(contains all object references but) 213 140.12 T
(no confusing byte arrays) 213 132.12 T
108 89 468 612 C
0 0 612 792 C
FMENDPAGE
%%EndPage: "64" 9
%%Page: "65" 9
612 792 0 FMBEGINPAGE
108 630 468 648 R
7 X
0 K
V
7 F
0 X
(AN EFFICIENT IMPLEMENTATION OF S) 108 641.33 T
0 F
(ELF) 284.01 641.33 T
7 F
(65) 458.01 641.33 T
108 89 468 612 R
7 X
V
3 F
0 X
-0.51 (T) 117 604.67 P
-0.51 (o avoid slowing the tight scanning loop with an explicit end-of-space check, the) 122.94 604.67 P
-0.65 (word after the end of the space is temporarily replaced with a ) 108 592.67 P
5 F
-0.65 (sentinel) 372.3 592.67 P
3 F
-0.65 ( reference that) 406.48 592.67 P
0.51 (matches the scanning criterion. The scanner checks for the end of the space only) 108 580.67 P
-0.25 (on a matching reference, instead of on every word. Early measurements on 68020-) 108 568.67 P
1.36 (based Sun-3/50\325) 108 556.67 P
1.36 (s showed that our S) 180.46 556.67 P
4 F
1.24 (ELF) 271.97 556.67 P
3 F
1.36 ( system scanned memory at the rate of) 289.74 556.67 P
0.06 (approximately 3 megabytes per second. Measurements of the fastest Smalltalk-80) 108 544.67 P
1.03 (implementation on the same machine indicated a scanning speed for non-segre-) 108 532.67 P
(gated memory spaces of only 1.6 megabytes per second.) 108 520.67 T
1.38 (For some kinds of scans, such as \336nding all objects that refer to a particular) 117 505.67 P
1.37 (object, the scanner needs to \336nd the objects that ) 108 493.67 P
5 F
1.37 (contain) 333.32 493.67 P
3 F
1.37 ( a matching reference,) 366.27 493.67 P
1.09 (rather than the reference itself. Our system can perform these types of searches) 108 481.67 P
0.66 (nearly as fast as a normal scan. W) 108 469.67 P
0.66 (e use a special tag for the \336rst header word of) 261.24 469.67 P
0.89 (every object \050called the ) 108 457.67 P
5 F
0.89 (mark) 217.11 457.67 P
3 F
0.89 ( word\051 to identify the beginning of the object. The) 239.69 457.67 P
-0.17 (scanner proceeds normally) 108 445.67 P
-0.17 (, searching for matching references. Once a reference is) 224.71 445.67 P
0.18 (found, the object containing the reference can be found by simply scanning back-) 108 433.67 P
0.65 (wards to the object\325) 108 421.67 P
0.65 (s mark word, and then converting the mark\325) 196.31 421.67 P
0.65 (s address into an) 393.11 421.67 P
(object reference.) 108 409.67 T
8 F
(3.3) 108 385.64 T
(Object Formats) 135 385.64 T
3 F
1 (A S) 117 367 P
4 F
0.91 (ELF) 134.79 367 P
3 F
1 ( memory space is or) 152.56 367 P
1 (ganized as a linear array of aligned 32-bit words.) 244.87 367 P
0.28 (Each word contains a low-order 2-bit tag \336eld, used to interpret the remaining 30) 108 355 P
-0.1 (bits of information. A reference to an integer or \337oating point number encodes the) 108 343 P
-0.39 (number directly in the reference itself. Converting between a tagged integer imme-) 108 331 P
0.61 (diate and its corresponding hardware representation requires only a shift instruc-) 108 319 P
0.03 (tion. Adding, subtracting, and comparing tagged integers require no conversion at) 108 307 P
1.34 (all. References to other S) 108 295 P
4 F
1.22 (ELF) 224.11 295 P
3 F
1.34 ( objects and references to map objects embed the) 241.88 295 P
-0.02 (address of the object in the reference \050remember that there is no object table\051. The) 108 283 P
1.81 (remaining tag format is used to mark the \336rst header word of each object, as) 108 271 P
0.1 (required by the scanning scheme discussed in the previous subsection. Pointers to) 108 259 P
0.5 (virtual machine functions and other objects not in the S) 108 247 P
4 F
0.45 (ELF) 355.7 247 P
3 F
0.5 ( heap are represented) 373.47 247 P
1.02 (using raw machine addresses; since their addresses are at least 16-bit half-word) 108 235 P
0.37 (aligned the scavenger will interpret them as immediates and won\325) 108 223 P
0.37 (t try to relocate) 400.07 223 P
(them.) 108 211 T
1.35 (Each object begins with two header words. The \336rst word is the mark word,) 117 196 P
0.58 (marking the beginning of the object. The mark contains several bit\336elds used by) 108 184 P
1.07 (the scavenger and an immutable bit\336eld used by the S) 108 172 P
4 F
0.97 (ELF) 354.69 172 P
3 F
1.07 ( ) 372.46 172 P
9 F
2.33 (hash) 376.27 172 P
3 F
1.07 ( primitive. The) 400.26 172 P
-0.07 (second word is a tagged reference to the object\325) 108 160 P
-0.07 (s map. A S) 316.7 160 P
4 F
-0.07 (ELF) 364.7 160 P
3 F
-0.07 ( object with assign-) 382.47 160 P
1.16 (able slots contains additional words to represent their contents. An array object) 108 148 P
1.31 (contains its length \050tagged as a S) 108 136 P
4 F
1.19 (ELF) 259.9 136 P
3 F
1.31 ( integer to prevent interactions with scav-) 277.67 136 P
-0.1 (enging and scanning\051 and its elements \050either 32-bit tagged object references or 8-) 108 124 P
(bit untagged bytes, padded out to the nearest 32-bit boundary\051.) 108 112 T
FMENDPAGE
%%EndPage: "65" 10
17 10 /Courier FMDEFINEFONT
%%Page: "66" 10
612 792 0 FMBEGINPAGE
108 630 468 648 R
7 X
0 K
V
7 F
0 X
(66) 108 641.33 T
(CHAMBERS, UNGAR, AND LEE) 332.8 641.33 T
108 89 468 612 R
7 X
V
3 F
0 X
0.81 (The representation of a map is similar) 117 384.65 P
0.81 (. Map objects begin with mark and map) 287.82 384.65 P
0.15 (words. All map objects share the same map, called the \322map map.\323 The map map) 108 372.65 P
0.89 (is its own map. All maps in new-space are linked together by their third words;) 108 360.65 P
1.04 (after a scavenge the system traverses this list to \336nalize inaccessible maps. The) 108 348.65 P
0.17 (fourth word of a map contains the virtual machine address of an array of function) 108 336.65 P
-0.2 (pointers;) 108 324.65 P
1 F
-0.16 (3) 146.45 329.05 P
3 F
-0.2 ( these functions perform format-dependent operations on objects or their) 150.95 324.65 P
(maps.) 108 312.65 T
0.53 (For maps of objects with slots, the \336fth word speci\336es the size of the object in) 117 297.65 P
0.82 (words. The sixth word indicates the number of slots in the object. The next two) 108 285.65 P
1.35 (words contain a change dependency link for the map, described in section 6.1.) 108 273.65 P
-0.23 (These four words are tagged as integers. If the map is for a method, the ninth word) 108 261.65 P
(references the byte code object representing the method\325) 108 249.65 T
(s source code.) 356.04 249.65 T
108 101 468 106.98 C
108 101 468 106.98 R
7 X
0 K
V
107.48 104.96 251.48 104.96 2 L
V
0.5 H
2 Z
0 X
N
0 0 612 792 C
10 F
0 X
0 K
(3) 117 98.6 T
1 F
(This function pointer array is exactly the virtual function array generated by the C++ compiler.) 120.49 95 T
108 89 468 612 C
168 391.99 408 612 C
168 391.99 408 612 R
7 X
0 K
V
178 583.66 395 601.66 R
V
0.5 H
0 Z
0 X
N
371 597.66 371 601.66 2 L
7 X
V
2 Z
0 X
N
371 583.66 371 587.66 2 L
7 X
V
0 X
N
13 F
(0) 390 603.66 T
(2) 364 603.66 T
(31) 178 603.66 T
17 F
(00) 377 588.66 T
13 F
(30-bit signed integer) 234.29 588.66 T
15 F
(integer immediate \050or virtual machine address\051) 173.92 566.66 T
177 528.66 393 547.66 R
7 X
V
0 Z
0 X
N
13 F
(0) 388 549.66 T
(2) 363 549.66 T
(31) 177 549.66 T
17 F
(01) 377 533.66 T
13 F
(top 30 bits of word-aligned address) 205.06 533.66 T
15 F
(reference to S) 214.03 512.66 T
16 F
(ELF) 280.68 512.66 T
15 F
( heap object) 297.66 512.66 T
370 547.66 370 543.66 2 L
7 X
V
2 Z
0 X
N
370 532.66 370 528.66 2 L
7 X
V
0 X
N
177 475.66 393 493.66 R
7 X
V
0 Z
0 X
N
13 F
(0) 388 495.66 T
(2) 363 495.66 T
(31) 177 495.66 T
17 F
(10) 377 480.66 T
13 F
(30 bits of IEEE floating point number) 202.06 480.66 T
15 F
(floating point immediate \050or v. m. address\051) 184.2 458.66 T
370 493.66 370 489.66 2 L
7 X
V
2 Z
0 X
N
370 475.66 370 479.66 2 L
7 X
V
0 X
N
177 421.66 393 439.66 R
7 X
V
0 Z
0 X
N
13 F
(0) 388 441.66 T
(2) 363 441.66 T
(31) 177 441.66 T
17 F
(11) 377 426.66 T
13 F
(scavenging fields and hash field) 211.31 426.66 T
15 F
(mark header word \050begins S) 178.76 404.66 T
16 F
(ELF) 312.62 404.66 T
15 F
( heap object\051) 329.59 404.66 T
370 439.66 370 435.66 2 L
7 X
V
2 Z
0 X
N
370 421.66 370 425.66 2 L
7 X
V
0 X
N
108 89 468 612 C
0 0 612 792 C
108 89 468 612 C
134.25 106.98 441.75 239.36 C
134.25 106.98 441.75 239.36 R
7 X
0 K
V
377.77 127.33 377.77 116.33 2 L
V
0.5 H
2 Z
0 X
N
391.77 127.33 391.77 116.33 2 L
7 X
V
0 X
N
362.77 127.33 362.77 116.33 2 L
7 X
V
0 X
N
362.77 165.33 362.77 143.33 2 L
7 X
V
0 X
N
90 450 1 1 377.77 139.33 G
0 Z
90 450 1 1 377.77 139.33 A
90 450 1 1 377.77 135.33 G
90 450 1 1 377.77 135.33 A
90 450 1 1 377.77 131.33 G
90 450 1 1 377.77 131.33 A
350.77 154.33 404.77 165.33 R
N
14 F
(bytes) 368.22 156.33 T
350.77 143.33 404.77 154.33 R
N
(bytes) 368.22 145.33 T
350.77 116.33 404.77 127.33 R
N
(bytes) 368.22 118.33 T
391.77 143.33 391.77 165.33 2 L
2 Z
N
377.77 165.33 377.77 143.33 2 L
N
15 F
(object with slots) 157.57 226.33 T
(object array) 258.92 226.33 T
(byte array) 353.89 226.33 T
169.73 196.33 223.73 207.33 R
0 Z
N
14 F
(map) 188.95 198.33 T
169.73 207.33 223.73 218.33 R
N
(mark) 187.84 209.33 T
260.25 196.33 314.25 207.33 R
N
(map) 279.47 198.33 T
260.25 207.33 314.25 218.33 R
N
(mark) 278.37 209.33 T
350.77 196.33 404.77 207.33 R
N
(map) 370 198.33 T
350.77 207.33 404.77 218.33 R
N
(mark) 368.89 209.33 T
260.25 175.33 314.25 186.33 R
N
(array length) 266.14 177.33 T
350.77 175.33 404.77 186.33 R
N
(array length) 356.67 177.33 T
169.73 175.33 223.73 186.33 R
N
(slot contents) 174.28 177.33 T
169.73 164.33 223.73 175.33 R
N
(slot contents) 174.28 166.33 T
169.73 137.33 223.73 148.33 R
N
(slot contents) 174.28 139.33 T
260.25 154.33 314.25 165.33 R
N
(element) 273.03 156.33 T
260.25 143.33 314.25 154.33 R
N
(element) 273.03 145.33 T
260.25 116.33 314.25 127.33 R
N
(element) 273.03 118.33 T
90 450 1 1 196.73 160.33 G
90 450 1 1 196.73 160.33 A
90 450 1 1 196.73 156.33 G
90 450 1 1 196.73 156.33 A
90 450 1 1 196.73 152.33 G
90 450 1 1 196.73 152.33 A
90 450 1 1 287.25 139.33 G
90 450 1 1 287.25 139.33 A
90 450 1 1 287.25 135.33 G
90 450 1 1 287.25 135.33 A
90 450 1 1 287.25 131.33 G
90 450 1 1 287.25 131.33 A
108 89 468 612 C
0 0 612 792 C
FMENDPAGE
%%EndPage: "66" 11
%%Page: "67" 11
612 792 0 FMBEGINPAGE
108 630 468 648 R
7 X
0 K
V
7 F
0 X
(AN EFFICIENT IMPLEMENTATION OF S) 108 641.33 T
0 F
(ELF) 284.01 641.33 T
7 F
(67) 458.01 641.33 T
108 89 468 612 R
7 X
V
3 F
0 X
0.58 (Finally) 117 348.31 P
0.58 (, the map includes a \336ve-word description for each of the object\325) 147.42 348.31 P
0.58 (s slots.) 437.51 348.31 P
0.51 (The \336rst word points to the S) 108 336.31 P
4 F
0.47 (ELF) 239.25 336.31 P
3 F
0.51 ( string object representing the name of the slot;) 257.02 336.31 P
0.15 (the next word describes both the type of the slot \050either constant data slot, assign-) 108 324.31 P
0.29 (able data slot, or assignment slot\051 and whether the slot is a parent slot.) 108 312.31 P
1 F
0.23 (4) 419.61 316.71 P
3 F
0.29 ( The third) 424.1 312.31 P
0.14 (word of a slot description contains either the contents of the slot \050if it\325) 108 300.31 P
0.14 (s a constant) 416.46 300.31 P
-0.55 (slot\051, the of) 108 288.31 P
-0.55 (fset within the object of the contents of the slot \050if it\325) 157.06 288.31 P
-0.55 (s an assignable data) 382.68 288.31 P
-0.55 (slot\051, or the index of the corresponding data slot \050if it\325) 108 276.31 P
-0.55 (s an assignment slot\051. The last) 338.33 276.31 P
-0.24 (two words of each slot contain a change dependency link for that slot, described in) 108 264.31 P
(section 6.1.) 108 252.31 T
108 111 468 116.98 C
108 111 468 116.98 R
7 X
0 K
V
107.48 114.96 251.48 114.96 2 L
V
0.5 H
2 Z
0 X
N
0 0 612 792 C
10 F
0 X
0 K
-0.18 (4) 117 108.6 P
1 F
-0.23 (In S) 120.49 105 P
6 F
-0.21 (ELF) 134.99 105 P
1 F
-0.23 ( parents are prioritized; the priority of a parent slot is stored in the second word of the slot) 149.21 105 P
(description.) 108 95 T
108 89 468 612 C
166.5 355.64 409.5 612 C
166.5 355.64 409.5 612 R
7 X
0 K
V
15 F
0 X
(map for) 348.5 603.97 T
(map for) 189.18 603.97 T
(map for) 270.17 603.97 T
179.5 437.97 233.5 470.97 R
0.5 H
0 Z
N
14 F
(slot) 200.28 455.97 T
(description) 189.17 447.97 T
15 F
(an array) 348.5 593.97 T
(a method) 265.29 593.97 T
(a data object) 175.95 593.97 T
179.5 563.97 233.5 574.97 R
N
14 F
(map map) 189.84 565.97 T
179.5 574.97 233.5 585.97 R
N
(mark) 197.62 576.97 T
90 450 1 1 206.5 433.97 G
90 450 1 1 206.5 433.97 A
90 450 1 1 206.5 429.97 G
90 450 1 1 206.5 429.97 A
90 450 1 1 206.5 425.97 G
90 450 1 1 206.5 425.97 A
179.5 532.97 233.5 543.97 R
N
(function array) 182.28 534.97 T
179.5 543.97 233.5 554.97 R
N
(g. c.  link) 190.73 545.97 T
179.5 501.97 233.5 512.97 R
N
(slot count) 189.39 503.97 T
179.5 512.97 233.5 523.97 R
N
(object length) 183.83 514.97 T
179.5 479.97 233.5 501.97 R
7 X
V
0 X
N
(link) 200.5 483.97 T
(dependency) 186.72 491.97 T
260.5 563.97 314.5 574.97 R
N
(map map) 270.84 565.97 T
260.5 574.97 314.5 585.97 R
N
(mark) 278.62 576.97 T
260.5 532.97 314.5 543.97 R
N
(function array) 263.28 534.97 T
260.5 543.97 314.5 554.97 R
N
(g. c.  link) 271.73 545.97 T
260.5 501.97 314.5 512.97 R
N
(slot count) 270.39 503.97 T
260.5 512.97 314.5 523.97 R
N
(object length) 264.83 514.97 T
260.5 479.97 314.5 501.97 R
7 X
V
0 X
N
(link) 281.5 483.97 T
(dependency) 267.72 491.97 T
341.5 563.97 395.5 574.97 R
N
(map map) 351.84 565.97 T
341.5 574.97 395.5 585.97 R
N
(mark) 359.62 576.97 T
341.5 532.97 395.5 543.97 R
N
(function array) 344.28 534.97 T
341.5 543.97 395.5 554.97 R
N
(g. c.  link) 352.73 545.97 T
260.5 459.97 314.5 470.97 R
N
(byte code) 270.17 461.97 T
179.5 388.97 233.5 421.97 R
N
(slot) 200.28 406.97 T
(description) 189.17 398.97 T
341.5 490.97 395.5 523.97 R
N
(parent slot) 348.83 508.97 T
(description) 351.17 500.97 T
260.5 417.97 314.5 450.97 R
N
(slot) 281.28 435.97 T
(description) 270.17 427.97 T
90 450 1 1 287.5 413.97 G
90 450 1 1 287.5 413.97 A
90 450 1 1 287.5 409.97 G
90 450 1 1 287.5 409.97 A
90 450 1 1 287.5 405.97 G
90 450 1 1 287.5 405.97 A
260.5 368.97 314.5 401.97 R
N
(slot) 281.28 386.97 T
(description) 270.17 378.97 T
108 89 468 612 C
0 0 612 792 C
108 89 468 612 C
166.5 116.98 409.5 239.2 C
166.5 116.98 409.5 239.2 R
7 X
0 K
V
15 F
0 X
(constant slot) 174.4 223.76 T
(data slot) 265.95 223.76 T
(assignment slot) 329.46 223.76 T
(description) 177.57 213.76 T
(description) 259.57 213.76 T
(description) 340.57 213.76 T
259.5 179.76 313.5 190.76 R
0.5 H
0 Z
N
14 F
(slot type) 271.61 181.76 T
259.5 190.76 313.5 201.76 R
N
(slot name) 269.17 192.76 T
259.5 128.76 313.5 150.76 R
7 X
V
0 X
N
(link) 280.5 132.76 T
(dependency) 265.72 140.76 T
259.5 159.76 313.5 170.76 R
N
(slot offset) 269.39 161.76 T
178.5 179.76 232.5 190.76 R
N
(slot type) 190.61 181.76 T
178.5 190.76 232.5 201.76 R
N
(slot name) 188.17 192.76 T
178.5 128.76 232.5 150.76 R
7 X
V
0 X
N
(link) 199.5 132.76 T
(dependency) 184.72 140.76 T
178.5 159.76 232.5 170.76 R
N
(slot contents) 183.06 161.76 T
340.5 179.76 397.5 190.76 R
N
(slot type) 353.61 181.76 T
340.5 190.76 397.5 201.76 R
N
(slot name) 351.17 192.76 T
340.5 128.76 397.5 150.76 R
7 X
V
0 X
N
(link) 363.5 132.76 T
(dependency) 347.72 140.76 T
340.5 159.76 397.5 170.76 R
N
(data slot index) 343.72 161.76 T
108 89 468 612 C
0 0 612 792 C
FMENDPAGE
%%EndPage: "67" 12
6 10 /Helvetica FMDEFINEFONT
16 8 /Helvetica-Oblique FMDEFINEFONT
%%Page: "68" 12
612 792 0 FMBEGINPAGE
108 630 468 648 R
7 X
0 K
V
7 F
0 X
(68) 108 641.33 T
(CHAMBERS, UNGAR, AND LEE) 332.8 641.33 T
108 89 468 612 R
7 X
V
108 89 468 612 C
125.25 94.65 450.75 612 C
125.25 94.65 450.75 612 R
7 X
0 K
V
219.14 418.05 244.14 474.05 R
3 X
V
0.5 H
0 Z
N
304.75 132.05 375.75 594.05 R
V
N
302.75 484.05 373.75 512.05 R
7 X
V
0 X
N
302.75 470.05 373.75 484.05 R
7 X
V
0 X
N
302.75 456.05 373.75 470.05 R
7 X
V
0 X
N
302.75 442.05 373.75 456.05 R
7 X
V
0 X
N
14 F
(\325parent\325) 324.64 473.05 T
302.75 582.05 373.75 596.05 R
7 X
V
0 X
N
302.75 568.05 373.75 582.05 R
7 X
V
0 X
N
302.75 554.05 373.75 568.05 R
7 X
V
0 X
N
302.75 540.05 373.75 554.05 R
7 X
V
0 X
N
302.75 526.05 373.75 540.05 R
7 X
V
0 X
N
302.75 512.05 373.75 526.05 R
7 X
V
0 X
N
(4) 335.53 529.05 T
(5) 335.53 515.05 T
302.75 414.05 373.75 442.05 R
7 X
V
0 X
N
12 F
(. . .) 331.5 587.05 T
302.75 400.05 373.75 414.05 R
7 X
V
0 X
N
302.75 386.05 373.75 400.05 R
7 X
V
0 X
N
302.75 372.05 373.75 386.05 R
7 X
V
0 X
N
14 F
(\325x\325) 333.98 403.05 T
302.75 344.05 373.75 372.05 R
7 X
V
0 X
N
302.75 330.05 373.75 344.05 R
7 X
V
0 X
N
302.75 316.05 373.75 330.05 R
7 X
V
0 X
N
302.75 302.05 373.75 316.05 R
7 X
V
0 X
N
(\325y\325) 333.98 333.05 T
302.75 274.05 373.75 302.05 R
7 X
V
0 X
N
302.75 260.05 373.75 274.05 R
7 X
V
0 X
N
302.75 246.05 373.75 260.05 R
7 X
V
0 X
N
302.75 232.05 373.75 246.05 R
7 X
V
0 X
N
(\325x:\325) 332.86 263.05 T
(assignment slot) 309.98 249.05 T
302.75 204.05 373.75 232.05 R
7 X
V
0 X
N
302.75 190.05 373.75 204.05 R
7 X
V
0 X
N
302.75 176.05 373.75 190.05 R
7 X
V
0 X
N
302.75 162.05 373.75 176.05 R
7 X
V
0 X
N
(\325y:\325) 332.86 193.05 T
(assignment slot) 309.98 179.05 T
302.75 134.05 373.75 162.05 R
7 X
V
0 X
N
(2) 335.53 375.05 T
(3) 335.53 305.05 T
(1) 335.53 235.05 T
(2) 335.53 165.05 T
143.25 182.9 278.25 301.05 R
7 X
V
4 F
0 X
1.7 (The representation of two carte-) 143.25 294.38 P
0.24 (sian point objects. The objects on) 143.25 283.38 P
0.8 (the left are the point \322instances,\323) 143.25 272.38 P
0.02 (containing the values of the ) 143.25 261.38 P
6 F
0.02 (x) 256.31 261.38 P
4 F
0.02 ( and) 261.3 261.38 P
6 F
0.88 (y) 143.25 250.38 P
4 F
0.79 ( assignable data slots. The right) 148.25 250.38 P
1.96 (object is the shared map for all) 143.25 239.38 P
3.55 (cartesian points, containing the) 143.25 228.38 P
0.85 (value of the constant ) 143.25 217.38 P
6 F
0.94 (parent) 232.13 217.38 P
4 F
0.85 ( slot) 260.46 217.38 P
-0.05 (and the of) 143.25 206.38 P
-0.05 (fsets of the assignable ) 182.95 206.38 P
6 F
-0.05 (x) 273.25 206.38 P
4 F
(and ) 143.25 195.38 T
6 F
(y) 160.18 195.38 T
4 F
( slots.) 165.18 195.38 T
218.14 462.05 242.14 476.05 R
7 X
V
0 X
N
218.14 448.05 242.14 462.05 R
7 X
V
0 X
N
218.14 434.05 242.14 448.05 R
7 X
V
0 X
N
218.14 420.05 242.14 434.05 R
7 X
V
0 X
N
14 F
(7.5) 226.02 437.05 T
(-24) 225.58 423.05 T
16 F
(slot name) 380.75 473.05 T
(slot type) 380.75 459.05 T
(mark) 380.75 585.05 T
(map) 380.75 571.05 T
(scavenging link) 380.75 557.05 T
(function array) 380.75 543.05 T
(link) 380.75 487.05 T
(map) 380.75 503.05 T
(dependency) 380.75 495.05 T
(link) 380.75 417.05 T
(slot) 380.75 433.05 T
(dependency) 380.75 425.05 T
378.75 484.05 432.75 484.05 2 L
7 X
V
1 H
2 Z
0 X
N
14 F
(const. parent slot) 307.31 459.05 T
16 F
(slot contents) 380.75 446.05 T
(object length) 380.75 529.05 T
(slot count) 380.75 515.05 T
(slot name) 380.75 403.05 T
(slot type) 380.75 389.05 T
(link) 380.75 347.05 T
(slot) 380.75 363.05 T
(dependency) 380.75 355.05 T
378.75 414.05 432.75 414.05 2 L
7 X
V
0 X
N
(slot offset) 380.75 376.05 T
(slot name) 380.75 333.05 T
(slot type) 380.75 319.05 T
(link) 380.75 277.05 T
(slot) 380.75 293.05 T
(dependency) 380.75 285.05 T
378.75 344.05 432.75 344.05 2 L
7 X
V
0 X
N
(slot offset) 380.75 306.05 T
(slot name) 380.75 263.05 T
(slot type) 380.75 249.05 T
(link) 380.75 207.05 T
(slot) 380.75 223.05 T
(dependency) 380.75 215.05 T
378.75 274.05 432.75 274.05 2 L
7 X
V
0 X
N
(data slot index) 380.75 236.05 T
(slot name) 380.75 193.05 T
(slot type) 380.75 179.05 T
(link) 380.75 137.05 T
(slot) 380.75 153.05 T
(dependency) 380.75 145.05 T
378.75 204.05 432.75 204.05 2 L
7 X
V
0 X
N
(data slot index) 380.75 166.05 T
14 F
(data slot) 322.64 389.05 T
(data slot) 322.64 319.05 T
12 F
(. . .) 331.5 559.05 T
(. . .) 331.5 545.05 T
(. . .) 331.5 495.05 T
(. . .) 331.5 425.05 T
(. . .) 331.5 356.05 T
(. . .) 331.5 286.05 T
(. . .) 331.5 217.05 T
(. . .) 331.5 146.05 T
16 F
(map map) 321.09 572.05 T
(cart. point traits) 310.42 446.05 T
(mark) 197.37 466.05 T
(map) 199.59 452.05 T
(slot contents) 170.25 437.05 T
(slot contents) 170.25 424.05 T
12 F
(. . .) 224.89 467.05 T
219.14 526.05 244.14 582.05 R
3 X
V
0.5 H
0 Z
N
218.14 570.05 242.14 584.05 R
7 X
V
0 X
N
218.14 556.05 242.14 570.05 R
7 X
V
0 X
N
218.14 542.05 242.14 556.05 R
7 X
V
0 X
N
218.14 528.05 242.14 542.05 R
7 X
V
0 X
N
14 F
(3) 228.91 545.05 T
(4) 228.91 531.05 T
16 F
(mark) 197.37 574.05 T
(map) 199.59 560.05 T
(slot contents) 170.25 545.05 T
(slot contents) 170.25 532.05 T
12 F
(. . .) 224.89 575.05 T
288.34 583.55 300.33 584.03 290.41 577.27 289.38 580.41 4 Y
V
230.95 454.74 M
 250.44 455.49 250.44 455.49 262.13 515.69 D
 271.93 566.14 273.52 574.32 289.37 580.42 D
N
289.24 591.69 301.24 591.84 291.15 585.36 290.2 588.52 4 Y
V
230.25 563.25 M
 249.4 564.68 249.4 564.68 262.96 574.69 D
 274.11 582.91 276.09 584.38 290.19 588.61 D
N
108 89 468 612 C
0 0 612 792 C
FMENDPAGE
%%EndPage: "68" 13
18 9 /Courier-Bold FMDEFINEFONT
%%Page: "69" 13
612 792 0 FMBEGINPAGE
108 630 468 648 R
7 X
0 K
V
7 F
0 X
(AN EFFICIENT IMPLEMENTATION OF S) 108 641.33 T
0 F
(ELF) 284.01 641.33 T
7 F
(69) 458.01 641.33 T
108 89 468 612 R
7 X
V
3 F
0 X
1.28 (From the above object formats, we can determine that the total space cost to) 117 604.67 P
0.04 (represent a clone family of ) 108 592.67 P
5 F
0.04 (n) 228.7 592.67 P
3 F
0.04 ( objects \050each with ) 234.2 592.67 P
5 F
0.04 (s) 319.78 592.67 P
3 F
0.04 ( slots, ) 324.05 592.67 P
5 F
0.04 (a) 352.52 592.67 P
3 F
0.04 ( of which are assignable\051) 358.01 592.67 P
-0.07 (is \0502 + ) 108 580.67 P
5 F
-0.07 (a) 138.71 580.67 P
3 F
-0.07 (\051) 144.21 580.67 P
5 F
-0.07 (n) 147.86 580.67 P
3 F
-0.07 ( + 5) 153.36 580.67 P
5 F
-0.07 (s) 170.4 580.67 P
3 F
-0.07 ( + 8 words. For the simple cartesian point example, ) 174.68 580.67 P
5 F
-0.07 (s) 402.34 580.67 P
3 F
-0.07 ( is 5 \050) 406.61 580.67 P
9 F
-0.15 (x) 431.13 580.67 P
3 F
-0.07 (, ) 437.13 580.67 P
9 F
-0.15 (x:) 442.55 580.67 P
3 F
-0.07 (, ) 454.55 580.67 P
9 F
-0.15 (y) 459.97 580.67 P
3 F
-0.07 (,) 465.25 580.67 P
9 F
0.12 (y:) 108 568.67 P
3 F
0.06 (, and ) 119.99 568.67 P
9 F
0.12 (parent) 144.21 568.67 P
3 F
0.06 (\051 and ) 180.19 568.67 P
5 F
0.06 (a) 205.32 568.67 P
3 F
0.06 ( is 2 \050) 210.81 568.67 P
9 F
0.12 (x) 235.7 568.67 P
3 F
0.06 ( and ) 241.7 568.67 P
9 F
0.12 (y) 263.17 568.67 P
3 F
0.06 (\051, leading to a total space cost to represent all) 269.17 568.67 P
0.58 (point objects of 4) 108 556.67 P
5 F
0.58 (n) 186.33 556.67 P
3 F
0.58 ( + 33 words. Published accounts of Smalltalk-80 systems [1) 191.82 556.67 P
0.58 (1,) 459.76 556.67 P
0.3 (29] indicate that these systems use at least two extra words per object: one for its) 108 544.67 P
-0.48 (class pointer and another for either its address or its hash code and \337ags. Therefore,) 108 532.67 P
-0.32 (maps allow objects in a prototype-based system like S) 108 520.67 P
4 F
-0.29 (ELF) 343.49 520.67 P
3 F
-0.32 ( to be represented just as) 361.26 520.67 P
(space-ef) 108 508.67 T
(\336ciently as objects in a class-based system like Smalltalk.) 144.4 508.67 T
2 F
(4) 108 475.3 T
(The Parser) 126 475.3 T
3 F
1.33 (T) 117 452.24 P
1.33 (o minimize parsing overhead, textual S) 122.94 452.24 P
4 F
1.21 (ELF) 301.71 452.24 P
3 F
1.33 ( programs are parsed once when) 319.48 452.24 P
-0.43 (entered into the system, generating S) 108 440.24 P
4 F
-0.39 (ELF) 268.19 440.24 P
3 F
-0.43 (-level ) 285.96 440.24 P
5 F
-0.43 (byte code) 313.3 440.24 P
3 F
-0.43 ( objects, much like Small-) 354.66 440.24 P
0.63 (talk ) 108 428.24 P
9 F
1.39 (CompiledMethod) 127.86 428.24 P
3 F
0.63 ( instances. Each method object represents its source code) 211.82 428.24 P
0.3 (by storing a reference to the pre-parsed byte code object in the method\325) 108 416.24 P
0.3 (s map; all) 424.67 416.24 P
-0.59 (cloned invocations of the method thus share the same byte code object. A byte code) 108 404.24 P
0.72 (object contains a byte array holding the byte codes for the source, and an object) 108 392.24 P
0.19 (array holding the message names and object literals used in the source. Each byte) 108 380.24 P
0.83 (code in the byte array represents a single byte-sized virtual machine instruction,) 108 368.24 P
0.81 (and is divided into two parts: a 3-bit opcode and a 5-bit object array index. The) 108 356.24 P
-0.68 (opcodes are speci\336ed as if for execution by a stack-oriented interpreter; in actuality) 108 344.24 P
-0.68 (,) 465.25 344.24 P
0.72 (our S) 108 332.24 P
4 F
0.65 (ELF) 132.22 332.24 P
3 F
0.72 ( compiler dynamically translates byte code objects into native machine) 149.99 332.24 P
1.98 (instructions just prior to execution. The only opcodes used to represent S) 108 320.24 P
4 F
1.8 (ELF) 450.23 320.24 P
3 F
(programs are the following:) 108 308.24 T
13 F
(SELF) 126 294.57 T
(push ) 144 284.57 T
18 F
(self) 165.98 284.57 T
13 F
( onto the execution stack) 187.55 284.57 T
(LITERAL <value index>) 126 271.57 T
(push a literal value onto the execution stack) 144 261.57 T
(SEND <message name index>) 126 248.57 T
0.49 (send a message, popping the receiver and arguments of) 144 238.57 P
0.49 (f the execution) 372.56 238.57 P
(stack and pushing the result) 144 228.57 T
(SELF SEND <message name index>) 126 215.57 T
-0.06 (send a message to ) 144 205.57 P
18 F
-0.13 (self) 222.18 205.57 P
13 F
-0.06 (, popping the arguments of) 243.75 205.57 P
-0.06 (f the execution stack) 350.26 205.57 P
(and pushing the result) 144 195.57 T
(SUPER SEND <message name index>) 126 182.57 T
3.76 (send a message to ) 144 172.57 P
18 F
8.12 (self) 237.48 172.57 P
13 F
3.76 (, delegated to all parents, popping the) 259.05 172.57 P
(arguments of) 144 162.57 T
(f the execution stack and pushing the result) 196.29 162.57 T
(DELEGA) 126 149.57 T
(TEE <parent name index>) 161.8 149.57 T
(delegate the next message send to the named parent) 144 139.57 T
(NON-LOCAL RETURN) 126 126.57 T
(execute a non-local return from the lexically-enclosing method activation) 144 116.57 T
(INDEX-EXTENSION <index extension>) 126 103.57 T
(extend the next index by prepending the index extension) 144 93.57 T
FMENDPAGE
%%EndPage: "69" 14
19 8 /Helvetica-Bold FMDEFINEFONT
%%Page: "70" 14
612 792 0 FMBEGINPAGE
108 630 468 648 R
7 X
0 K
V
7 F
0 X
(70) 108 641.33 T
(CHAMBERS, UNGAR, AND LEE) 332.8 641.33 T
108 89 468 612 R
7 X
V
3 F
0 X
0.25 (The index for the opcodes is an index into the accompanying object array) 108 271.67 P
0.25 (. The 5-) 433.04 271.67 P
0.36 (bit of) 108 259.67 P
0.36 (fset allows the \336rst 32 message names and literals to be referred to directly;) 131.66 259.67 P
1.53 (indices lar) 108 247.67 P
1.53 (ger than 32 are constructed using extra ) 154.8 247.67 P
6 F
1.55 (INDEX-EXTENSION) 338.53 247.67 P
3 F
1.53 ( instruc-) 430.16 247.67 P
(tions.) 108 235.67 T
-0.53 (In S) 117 220.67 P
4 F
-0.48 (ELF) 134.48 220.67 P
3 F
-0.53 ( source code, primitive operations are invoked with the same syntax used) 152.24 220.67 P
-0.07 (to send a message, except that the message name begins with an underscore \050\322_\323\051.) 108 208.67 P
-0.03 (Every call of a primitive operation may optionally pass in a block to be invoked if) 108 196.67 P
0.92 (the primitive fails by appending ) 108 184.67 P
9 F
2.01 (IfFail:) 255.73 184.67 P
3 F
0.92 ( to the message name. If invoked, the) 297.7 184.67 P
0.76 (block is passed an error code identifying the nature of the failure \050e.g. over\337ow) 108 172.67 P
0.76 (,) 465.25 172.67 P
-0.31 (divide by zero, or incorrect ar) 108 160.67 P
-0.31 (gument type\051. The normal ) 236.8 160.67 P
6 F
-0.32 (SEND) 353.02 160.67 P
3 F
-0.31 ( byte codes are used) 380.79 160.67 P
1.37 (to represent all primitive operation invocations, simplifying the byte codes and) 108 148.67 P
1.64 (facilitating extensions to the set of available primitive operations. By contrast,) 108 136.67 P
-0.28 (Smalltalk-80 primitives are invoked by number rather than name, and may only be) 108 124.67 P
-0.29 (called at the beginning of a method. The rest of the method is executed if the prim-) 108 112.67 P
(itive fails, without any indication of why the primitive failed.) 108 100.67 T
108 89 468 612 C
138.75 279.01 437.25 612 C
138.75 279.01 437.25 612 R
7 X
0 K
V
333.25 413 366.25 460 R
3 X
V
0.5 H
0 Z
N
331.25 451 364.25 463 R
7 X
V
0 X
N
251.25 565 323.25 583 R
3 X
V
N
249.25 576 286.25 585 R
7 X
V
0 X
N
249.25 567 286.25 576 R
7 X
V
0 X
N
16 F
(\050code\051) 257.92 568 T
286.25 576 321.25 585 R
7 X
V
0 X
N
286.25 567 321.25 576 R
7 X
V
0 X
N
249.25 494 321.25 512 R
3 X
V
N
247.25 505 284.25 514 R
7 X
V
0 X
N
14 F
(literals) 256.7 507 T
247.25 496 284.25 505 R
7 X
V
0 X
N
(codes) 256.58 497 T
284.25 505 319.25 514 R
7 X
V
0 X
N
284.25 496 319.25 505 R
7 X
V
0 X
N
12 F
(. . .) 298 579 T
147.75 292.76 426.75 373.76 R
7 X
V
4 F
0 X
0.65 (The representation of the point ) 147.75 367.1 P
18 F
1.41 (print) 276.76 367.1 P
4 F
0.65 ( method. The top object is the) 303.73 367.1 P
-0.14 (prototype activation record, containing placeholders for the local slots) 147.75 356.1 P
0.29 (of the method \050in this case, just the ) 147.75 345.1 P
18 F
0.62 (self) 292.45 345.1 P
4 F
0.29 ( slot\051 plus a reference to the) 314.02 345.1 P
0.75 (byte code object representing the source code \050actually stored in the) 147.75 334.1 P
-0.27 (method\325) 147.75 323.1 P
-0.27 (s map\051. The byte code object contains a byte array for the byte) 180.51 323.1 P
1.23 (codes themselves, and a separate object array for the constants and) 147.75 312.1 P
(message names used in the source code.) 147.75 301.1 T
15 F
(method object) 218.25 600 T
(byte code object) 218.25 540 T
(\050prototype activation record\051) 218.25 590 T
304.25 517.46 302.25 514 300.25 517.46 3 L
1 H
N
302.25 571 302.25 514 2 L
7 X
V
2 Z
0 X
N
14 F
(SELF SEND #0  ) 210.58 453 T
16 F
(\050x\051) 270.58 453 T
14 F
(SEND #1  ) 221.25 441 T
16 F
(\050print\051) 259.02 441 T
14 F
(LITERAL #2  ) 218.58 429 T
16 F
(\050\325, \325\051) 266.58 429 T
14 F
(SEND #1  ) 221.25 417 T
16 F
(\050print\051) 259.02 417 T
14 F
(SELF SEND #3  ) 210.58 405 T
16 F
(\050y\051) 270.58 405 T
14 F
(SEND #1  ) 221.25 393 T
16 F
(\050print\051) 259.02 393 T
15 F
(byte code array) 218.25 468 T
(literal) 317.58 478 T
302.25 509 337.25 509 2 L
7 X
V
0 X
N
350.25 466.46 348.25 463 346.25 466.46 3 L
0 Z
N
348.25 499 348.25 463 2 L
7 X
V
2 Z
0 X
N
304.25 465.46 302.25 462 300.25 465.46 3 L
0 Z
N
302.25 500 302.25 462 2 L
7 X
V
2 Z
0 X
N
(array) 319.8 468 T
19 F
(self) 261.81 577 T
14 F
(*) 275.58 577 T
331.25 439 364.25 451 R
7 X
V
0.5 H
0 Z
0 X
N
331.25 427 364.25 439 R
7 X
V
0 X
N
331.25 415 364.25 427 R
7 X
V
0 X
N
(\325x\325) 343.48 454 T
(\325print\325) 337.7 442 T
(\325, \325) 343.25 430 T
(\325y\325) 343.48 418 T
294.25 389 312.25 460 R
3 X
V
N
293.25 451 310.25 463 R
7 X
V
0 X
N
293.25 439 310.25 451 R
7 X
V
0 X
N
293.25 427 310.25 439 R
7 X
V
0 X
N
293.25 415 310.25 427 R
7 X
V
0 X
N
293.25 403 310.25 415 R
7 X
V
0 X
N
293.25 391 310.25 403 R
7 X
V
0 X
N
15 F
(\050source code) 218.25 530 T
( representation\051) 218.25 520 T
17 F
(60) 296.25 453 T
(41) 296.25 441 T
(22) 296.25 429 T
(41) 296.25 417 T
(41) 296.25 393 T
(63) 296.25 405 T
1 H
2 Z
0 90 11 10 337.25 499 A
108 89 468 612 C
0 0 612 792 C
108 289 468 289 2 L
0.5 H
2 Z
0 X
0 K
N
FMENDPAGE
%%EndPage: "70" 15
20 11 /Courier-Bold FMDEFINEFONT
%%Page: "71" 15
612 792 0 FMBEGINPAGE
108 630 468 648 R
7 X
0 K
V
7 F
0 X
(AN EFFICIENT IMPLEMENTATION OF S) 108 641.33 T
0 F
(ELF) 284.01 641.33 T
7 F
(71) 458.01 641.33 T
108 89 468 612 R
7 X
V
3 F
0 X
1.02 (The byte codes needed to express S) 117 604.67 P
4 F
0.93 (ELF) 279.34 604.67 P
3 F
1.02 ( programs fall into only three classes:) 297.11 604.67 P
-0.3 (base values \050) 108 592.67 P
6 F
-0.31 (LITERAL) 164.14 592.67 P
3 F
-0.3 ( and ) 204.68 592.67 P
6 F
-0.31 (SELF) 225.43 592.67 P
3 F
-0.3 (\051, message sends, and non-local return. This small) 250.43 592.67 P
-0.46 (number results from both the simplicity and elegance of the S) 108 580.67 P
4 F
-0.41 (ELF) 374.41 580.67 P
3 F
-0.46 ( language and the) 392.18 580.67 P
-0.54 (lack of elaborate space-saving encodings. Smalltalk-80 de\336nes a much lar) 108 568.67 P
-0.54 (ger set of) 428.2 568.67 P
0.36 (byte codes [12], tuned to minimize space and maximize interpretation speed, and) 108 556.67 P
0.21 (includes byte codes to fetch and store local, instance, class, pool, and global vari-) 108 544.67 P
3.29 (ables and shortcut byte codes for common-case operations such as loading) 108 532.67 P
(constants like ) 108 520.67 T
9 F
(nil) 170.86 520.67 T
3 F
(, ) 188.85 520.67 T
9 F
(true) 194.35 520.67 T
3 F
(, and ) 218.33 520.67 T
9 F
(0) 242.44 520.67 T
3 F
(.) 248.43 520.67 T
1.9 (Smalltalk-80 systems also use special control \337ow byte codes to implement) 117 505.67 P
-0.59 (common boolean messages like ) 108 493.67 P
9 F
-1.29 (ifTrue:ifFalse:) 247.82 493.67 P
3 F
-0.59 ( and ) 337.77 493.67 P
9 F
-1.29 (whileTrue:) 357.95 493.67 P
3 F
-0.59 (; the Small-) 417.91 493.67 P
-0.01 (talk parser translates the message sends into conditional and unconditional branch) 108 481.67 P
0.52 (byte codes, open-coding the ar) 108 469.67 P
0.52 (gument blocks. Similarly) 244.43 469.67 P
0.52 (, the ) 355.55 469.67 P
9 F
1.14 (=) 378.25 469.67 P
1.14 (=) 385.08 469.67 P
3 F
0.52 ( message is auto-) 391.07 469.67 P
0.14 (matically translated into the identity comparison primitive operation byte code. A) 108 457.67 P
-0.04 (similar optimization is included for messages like ) 108 445.67 P
9 F
-0.08 (+) 329 445.67 P
3 F
-0.04 ( and ) 334.99 445.67 P
9 F
-0.08 (<) 356.28 445.67 P
3 F
-0.04 (, which the parser trans-) 362.28 445.67 P
2.02 (lates into special byte codes. When executed, these byte codes either directly) 108 433.67 P
-0.22 (invoke the corresponding integer primitive operation \050if the receiver is an integer\051,) 108 421.67 P
(or perform the message send \050if the receiver isn\325) 108 409.67 T
(t an integer\051.) 320.75 409.67 T
3.52 (Although this special processing for common messages may signi\336cantly) 117 394.67 P
2.17 (improve the performance of existing Smalltalk systems, especially interpreted) 108 382.67 P
(ones, they violate the extensible and \337exible spirit of Smalltalk:) 108 370.67 T
(\245) 117 355.67 T
-0.58 (The source code for the hard-wired methods is relegated to documentation, and) 126 355.67 P
1.63 (all changes to the hard-wired source code are ignored by the system. Any) 126 343.67 P
0.71 (de\336nitions of ) 126 331.67 P
20 F
1.7 (ifTrue:ifFalse:) 188.45 331.67 P
3 F
0.71 (, ) 287.33 331.67 P
20 F
1.7 (whileTrue:) 293.53 331.67 P
3 F
0.71 (, and ) 359.45 331.67 P
20 F
1.7 (=) 384.96 331.67 P
1.7 (=) 392.47 331.67 P
3 F
0.71 ( for other types) 399.06 331.67 P
(of objects are ignored.) 126 319.67 T
(\245) 117 305.67 T
0.15 (The receiver of an ) 126 305.67 P
20 F
0.36 (ifTrue:ifFalse:) 209.57 305.67 P
3 F
0.15 ( message must evaluate to either the) 308.44 305.67 P
20 F
4.7 (true) 126 293.67 P
3 F
1.96 ( or the ) 152.37 293.67 P
20 F
4.7 (false) 189.06 293.67 P
3 F
1.96 ( object at run-time and the ar) 222.02 293.67 P
1.96 (guments must be block) 360.5 293.67 P
1.51 (literals at parse-time; the receiver and ar) 126 281.67 P
1.51 (gument to ) 311.81 281.67 P
20 F
3.62 (whileTrue:) 361.83 281.67 P
3 F
1.51 ( must be) 427.75 281.67 P
0.3 (block literals at parse-time, and the receiver block must evaluate to either the) 126 269.67 P
20 F
(true) 126 257.67 T
3 F
( or the ) 152.37 257.67 T
20 F
(false) 183.18 257.67 T
3 F
( object at run-time.) 216.14 257.67 T
(\245) 117 243.67 T
1.44 (Perhaps the worst aspect of these parser \322optimizations\323 is that they tempt) 126 243.67 P
2.26 (programmers to select inappropriate control structures like ) 126 231.67 P
20 F
5.42 (whileTrue:) 402.08 231.67 P
3 F
(instead of ) 126 219.67 T
20 F
(to:do:) 171.77 219.67 T
3 F
( to obtain the performance of the hard-wired message. ) 211.32 219.67 T
-0.12 (In ef) 108 204.67 P
-0.12 (fect, these hard-wired messages have become the non-object-oriented built-in) 128.12 204.67 P
-0.26 (operators of Smalltalk. Our S) 108 192.67 P
4 F
-0.24 (ELF) 236.03 192.67 P
3 F
-0.26 ( system incorporates none of these tricks. Instead) 253.8 192.67 P
-0.08 (our compilation techniques achieve better performance without compromising the) 108 180.67 P
1.56 (language\325) 108 168.67 P
1.56 (s conceptual simplicity and elegance, preserving the message passing) 150.71 168.67 P
(model for ) 108 156.67 T
5 F
(all) 153.77 156.67 T
3 F
( messages.) 165.37 156.67 T
FMENDPAGE
%%EndPage: "71" 16
%%Page: "72" 16
612 792 0 FMBEGINPAGE
108 630 468 648 R
7 X
0 K
V
7 F
0 X
(72) 108 641.33 T
(CHAMBERS, UNGAR, AND LEE) 332.8 641.33 T
108 89 468 612 R
7 X
V
2 F
0 X
(5) 108 603.3 T
(The Compiler) 126 603.3 T
3 F
0.16 (The S) 117 580.24 P
4 F
0.14 (ELF) 143.1 580.24 P
3 F
0.16 ( compiler is a signi\336cant part of our ef) 160.87 580.24 P
0.16 (\336cient implementation [6]. It is) 330.35 580.24 P
-0.07 (similar to the Deutsch-Schif) 108 568.24 P
-0.07 (fman translator described in [1) 231.19 568.24 P
-0.07 (1] \050and implemented in) 365.37 568.24 P
-0.31 (the ParcPlace Smalltalk-80 system\051 in that it supports ) 108 556.24 P
5 F
-0.31 (dynamic translation) 343.52 556.24 P
3 F
-0.31 ( of byte-) 431.4 556.24 P
-0.34 (coded methods into machine code transparently on demand at run-time, and it uses) 108 544.24 P
-0.17 (an ) 108 532.24 P
5 F
-0.17 (inline caching) 120.95 532.24 P
3 F
-0.17 ( technique to reduce the cost of non-polymorphic message sends.) 183.33 532.24 P
0.4 (However) 108 520.24 P
0.4 (, although the Deutsch-Schif) 147.82 520.24 P
0.4 (fman system is the fastest Smalltalk system) 274.55 520.24 P
2.65 (\050as of July 1989\051, it still runs about 10 times slower than optimized C. By) 108 508.24 P
2.79 (combining traditional optimizing compiler technology) 108 496.24 P
2.79 (, techniques from high-) 357.1 496.24 P
0.5 (performance Smalltalk systems, and some critical new techniques we developed,) 108 484.24 P
-0.36 (our S) 108 472.24 P
4 F
-0.33 (ELF) 131.14 472.24 P
3 F
-0.36 ( compiler has already achieved a level of performance more than twice as) 148.91 472.24 P
-0.27 (fast as the Deutsch-Schif) 108 460.24 P
-0.27 (fman system, and only 4 to 5) 216.52 460.24 P
8 F
-0.27 ( ) 342.14 460.24 P
3 F
-0.27 (times slower than optimized) 344.61 460.24 P
0.36 (C. W) 108 448.24 P
0.36 (e hope that our second-generation system under construction \050and described) 130.67 448.24 P
(in section 7\051 will achieve even better levels of performance.) 108 436.24 T
-0.64 (The main obstacle to generating ef) 117 421.24 P
-0.64 (\336cient code from Smalltalk programs, as many) 265.86 421.24 P
1.19 (people have noted before [1, 2, 14], is that very little static type information is) 108 409.24 P
1.55 (available in the Smalltalk source. Only literal constants have a known class at) 108 397.24 P
1.54 (compile-time; without detailed analysis, no other types are known. T) 108 385.24 P
1.54 (ype infer-) 423.45 385.24 P
-0.68 (encing is dif) 108 373.24 P
-0.68 (\336cult for Smalltalk programs, especially when the compiler is using the) 160.76 373.24 P
4.43 (inferred types to improve performance [5, 8, 28]. Even if the Smalltalk) 108 361.24 P
2.19 (programmer were willing to sacri\336ce many of the bene\336ts of his exploratory) 108 349.24 P
-0.55 (programming environment and annotate his programs with static type declarations,) 108 337.24 P
0.37 (designing an adequate type system for Smalltalk would be hard [1, 14]; the more) 108 325.24 P
-0.67 (\337exible the type system, the smaller the performance improvement possible and the) 108 313.24 P
(smaller the reward for including type declarations in the \336rst place.) 108 301.24 T
0.24 (S) 117 286.24 P
4 F
0.22 (ELF) 123.11 286.24 P
3 F
0.24 ( programs are even harder to compile ef) 140.88 286.24 P
0.24 (\336ciently than Smalltalk programs.) 317.76 286.24 P
0.35 (All the problems of missing static type information that Smalltalk compilers face) 108 274.24 P
-0.49 (are also faced by our S) 108 262.24 P
4 F
-0.45 (ELF) 205.91 262.24 P
3 F
-0.49 ( compiler) 223.68 262.24 P
-0.49 (. In addition, all variables in S) 264.39 262.24 P
4 F
-0.45 (ELF) 393.88 262.24 P
3 F
-0.49 ( are accessed) 411.65 262.24 P
1.6 (by sending messages, rather than being explicitly identi\336ed as variables in the) 108 250.24 P
0.56 (source code and byte codes. And since there are no classes in S) 108 238.24 P
4 F
0.51 (ELF) 392.67 238.24 P
3 F
0.56 (, some of the) 409.56 238.24 P
3.38 (class-based techniques used to optimize Smalltalk programs, such as inline) 108 226.24 P
0.12 (caching, type inferencing, and static type checking, cannot be directly used in our) 108 214.24 P
(S) 108 202.24 T
4 F
(ELF) 114.11 202.24 T
3 F
( system.) 131.88 202.24 T
1.08 (Rather than compromising the \337exibility of S) 117 187.24 P
4 F
0.98 (ELF) 323.07 187.24 P
3 F
1.08 ( programs with a static type) 340.84 187.24 P
-0.52 (system, or compromising the execution speed of programs by interpreting dynamic) 108 175.24 P
1.25 (type information, we have developed compilation techniques that) 108 163.24 P
5 F
1.25 ( ) 404.19 163.24 P
3 F
1.25 (automatically) 408.19 163.24 P
0.22 (derive much of the type information statically speci\336ed in other type systems. By) 108 151.24 P
-0.49 (combining this extra information with a few general-purpose techniques from opti-) 108 139.24 P
2.83 (mizing compilers for traditional languages like Fortran and C, our compiler) 108 127.24 P
0.41 (achieves good performance without sacri\336cing any of the comforts of an interac-) 108 115.24 P
2.26 (tive, exploratory programming environment: fast turnaround for programming) 108 103.24 P
FMENDPAGE
%%EndPage: "72" 17
%%Page: "73" 17
612 792 0 FMBEGINPAGE
108 630 468 648 R
7 X
0 K
V
7 F
0 X
(AN EFFICIENT IMPLEMENTATION OF S) 108 641.33 T
0 F
(ELF) 284.01 641.33 T
7 F
(73) 458.01 641.33 T
108 89 468 612 R
7 X
V
3 F
0 X
1.56 (changes, complete source-level debugging, and a simple, elegant programming) 108 604.67 P
0.09 (language unfettered by static type declarations. The next few subsections summa-) 108 592.67 P
0.3 (rize our new compilation techniques; a more detailed discussion may be found in) 108 580.67 P
([6, 7]. ) 108 568.67 T
8 F
(5.1) 108 544.64 T
(Customized Compilation) 135 544.64 T
3 F
1.33 (The Deutsch-Schif) 117 526 P
1.33 (fman Smalltalk-80 system compiles a single machine code) 200.82 526 P
0.09 (method for a given source code method. Since many classes may inherit the same) 108 514 P
-0.33 (method the Smalltalk-80 compiler cannot know the exact class of the receiver) 108 502 P
-0.33 (. Our) 445.76 502 P
0.4 (S) 108 490 P
4 F
0.36 (ELF) 114.11 490 P
3 F
0.4 ( compiler) 131.88 490 P
0.4 (, on the other hand, compiles a dif) 173.64 490 P
0.4 (ferent machine code method ) 326.05 490 P
5 F
0.4 (for) 455.18 490 P
1.95 (each type of r) 108 478 P
1.95 (eceiver ) 173.56 478 P
3 F
1.95 (that runs a given source method. The advantage of this) 209.98 478 P
1.95 (approach is that our S) 108 466 P
4 F
1.78 (ELF) 211.63 466 P
3 F
1.95 ( compiler can know the type of the receiver of the) 229.4 466 P
2.21 (message at compile-time, and can generate much better code for each of the) 108 454 P
0.4 (speci\336c versions of a method than it could for a single general-purpose compiled) 108 442 P
2.61 (method. W) 108 430 P
2.61 (e call this technique of dynamic translation of multiple specially-) 158.56 430 P
(compiled methods for a single source-code method ) 108 418 T
5 F
(customized compilation) 335.32 418 T
3 F
(.) 439.38 418 T
(Consider the ) 117 403 T
9 F
(min:) 175.59 403 T
3 F
( method de\336ned for all objects:) 199.58 403 T
17 F
(min: arg = \050 < arg ifTrue: [self] False: [arg] \051.) 126 388.67 T
3 F
0.17 (This method could be invoked on integers, \337oating point numbers, strings, or any) 108 374 P
2.28 (other objects that can be compared using ) 108 362 P
9 F
4.98 (<) 306.11 362 P
3 F
2.28 (. Like other dynamic compilation) 312.11 362 P
1.57 (systems, our S) 108 350 P
4 F
1.43 (ELF) 174.93 350 P
3 F
1.57 ( system waits until the ) 192.7 350 P
9 F
3.43 (min:) 301.58 350 P
3 F
1.57 ( method is \336rst invoked before) 325.57 350 P
1.16 (compiling any code for this method. Other systems would compile this method) 108 338 P
-0.16 (once for all receiver and ar) 108 326 P
-0.16 (gument types, which would require generating the code) 225.04 326 P
-0.5 (for a full message dispatch to select the right ) 108 314 P
9 F
-1.1 (<) 302.72 314 P
3 F
-0.5 ( comparison routine. Since our S) 308.71 314 P
4 F
-0.46 (ELF) 450.23 314 P
3 F
2.16 (compiler generates a separate compiled version for each receiver type, it can) 108 302 P
0.89 (customize the version to that speci\336c receiver type, and use the new-found type) 108 290 P
(information to optimize the ) 108 278 T
9 F
(<) 231.29 278 T
3 F
( message.) 237.29 278 T
2.36 (Let\325) 117 263 P
2.36 (s trace the operations of our S) 134.7 263 P
4 F
2.15 (ELF) 280.07 263 P
3 F
2.36 ( compiler to evaluate the expression) 297.84 263 P
9 F
-0.52 (i) 108 251 P
-0.52 (min:) 119.99 251 P
-0.52 (j) 149.98 251 P
3 F
-0.24 (, where ) 155.97 251 P
9 F
-0.52 (i) 190.58 251 P
3 F
-0.24 ( contains an integer at run-time. Assuming this is the \336rst time) 196.57 251 P
9 F
0.3 (min:) 108 239 P
3 F
0.14 ( has been sent to an integer) 131.99 239 P
0.14 (, our compiler will generate code for a version of) 251.37 239 P
9 F
-0.65 (min:) 108 227 P
3 F
-0.3 ( that is customized for integer receivers. The compiler \336rst builds the internal) 131.99 227 P
0.61 (\337ow graph pictured at the top of the next page \050expensive operations are in bold) 108 215 P
(face\051.) 108 203 T
1 F
(5) 132.7 207.4 T
3 F
-0.4 (Many of the expensive operations can be eliminated by ) 117 188 P
5 F
-0.4 (inlining) 359.03 188 P
3 F
-0.4 ( messages sent to) 393.22 188 P
(receivers of known type, as described next.) 108 176 T
108 111 468 116.98 C
108 111 468 116.98 R
7 X
0 K
V
107.48 114.96 251.48 114.96 2 L
V
0.5 H
2 Z
0 X
N
0 0 612 792 C
10 F
0 X
0 K
0.15 (5) 117 108.6 P
1 F
0.19 (To simplify the discussion, message sends that access local slots within the executing activation) 120.49 105 P
(record \050e.g. arguments\051 are assumed to be replaced with local register accesses immediately.) 108 95 T
FMENDPAGE
%%EndPage: "73" 18
%%Page: "74" 18
612 792 0 FMBEGINPAGE
108 630 468 648 R
7 X
0 K
V
7 F
0 X
(74) 108 641.33 T
(CHAMBERS, UNGAR, AND LEE) 332.8 641.33 T
108 89 468 612 R
7 X
V
8 F
0 X
(5.2) 108 403.89 T
(Message Inlining) 135 403.89 T
3 F
-0.07 (Our compiler uses sources of type information, such as the types of source-code) 117 385.25 P
1.25 (literals and the type of ) 108 373.25 P
9 F
2.74 (self) 215.27 373.25 P
3 F
1.25 ( gleaned from customized compilation, to perform) 239.26 373.25 P
5 F
-0.14 (compile-time message lookup) 108 361.25 P
3 F
-0.14 ( and ) 237.69 361.25 P
5 F
-0.14 (message inlining) 258.77 361.25 P
3 F
-0.14 (. If the type of the receiver of a) 332.78 361.25 P
0.16 (message is known at compile-time, the compiler can perform the message lookup) 108 349.25 P
0.05 (at compile-time rather than wait until run-time. If this lookup is successful, which) 108 337.25 P
1.85 (it will be in the absence of dynamic inheritance and programming errors, our) 108 325.25 P
(compiler will do one of the following:) 108 313.25 T
(\245) 117 298.25 T
0.3 (If the slot contains a method, the compiler will ) 126 298.25 P
5 F
0.3 (inline) 336.81 298.25 P
3 F
0.3 ( the body of the method) 361.84 298.25 P
(at the call site, if the method is short enough and nonrecursive.) 126 286.25 T
(\245) 117 272.25 T
0.39 (If the slot contains a block ) 126 272.25 P
20 F
0.94 (value) 247.36 272.25 P
3 F
0.39 ( method, the compiler will inline the body) 280.32 272.25 P
-0.56 (of the block ) 126 260.25 P
20 F
-1.34 (value) 179.55 260.25 P
3 F
-0.56 ( method at the call site, if it is short enough. If after inlining) 212.51 260.25 P
-0.31 (there are no remaining uses of the block object, the compiler will eliminate the) 126 248.25 P
(code to create the block at run-time.) 126 236.25 T
(\245) 117 222.25 T
0.65 (If the slot is a constant data slot, the compiler will replace the message send) 126 222.25 P
(with the value of the slot \050a constant known at compile-time\051.) 126 210.25 T
(\245) 117 196.25 T
-0.4 (If the slot is an assignable data slot, the compiler will replace the message send) 126 196.25 P
(with code to fetch the contents of the slot \050e.g. a load instruction\051.) 126 184.25 T
(\245) 117 170.25 T
0.91 (If the slot is an assignment slot, the compiler will replace the message send) 126 170.25 P
(with code to update the contents of the slot \050e.g. a store instruction\051.) 126 158.25 T
1 (After inlining all messages sent to receivers of known type, the compiler will) 117 143.25 P
-0.51 (have inlined all messages that in an equivalent Smalltalk program would have been) 108 131.26 P
-0.34 (variable references or assignments, thus eliminating the overhead in S) 108 119.26 P
4 F
-0.31 (ELF) 412.46 119.26 P
3 F
-0.34 ( of using) 430.24 119.26 P
0.25 (message passing to access variables. In addition, many more messages have been) 108 107.26 P
(inlined that in a Smalltalk system would have remained full message sends.) 108 95.26 T
108 89 468 612 C
168 411.26 408 612 C
168 411.26 408 612 R
7 X
0 K
V
288 601.29 288 423.29 2 L
V
1 H
2 Z
0 X
N
266 542.29 311 560.29 R
7 X
V
0.5 H
0 Z
0 X
N
261 567.29 315 585.29 R
7 X
V
0 X
N
257 592.29 320 610.29 R
7 X
V
0 X
N
252 517.29 324 535.29 R
7 X
V
0 X
N
252 492.29 324 510.29 R
7 X
V
0 X
N
257 467.29 320 485.29 R
7 X
V
0 X
N
252 442.29 324 460.29 R
7 X
V
0 X
N
234 417.29 342 435.29 R
7 X
V
0 X
N
12 F
(send) 274 547.29 T
4 F
( ) 293.44 547.29 T
17 F
(<) 295.94 547.29 T
4 F
(push ) 265.32 597.29 T
17 F
(self) 286.7 597.29 T
4 F
(push ) 268 572.29 T
17 F
(arg) 289.38 572.29 T
12 F
(send) 239.05 422.29 T
4 F
( ) 258.49 422.29 T
17 F
(ifTrue:False:) 260.99 422.29 T
4 F
(push ) 262 522.29 T
17 F
([self]) 283.38 522.29 T
4 F
(push ) 264 473.29 T
17 F
([arg]) 285.38 473.29 T
12 F
(create-closure) 258 497.29 T
(create-closure) 257 447.29 T
108 89 468 612 C
0 0 612 792 C
FMENDPAGE
%%EndPage: "74" 19
%%Page: "75" 19
612 792 0 FMBEGINPAGE
108 630 468 648 R
7 X
0 K
V
7 F
0 X
(AN EFFICIENT IMPLEMENTATION OF S) 108 641.33 T
0 F
(ELF) 284.01 641.33 T
7 F
(75) 458.01 641.33 T
108 89 468 612 R
7 X
V
3 F
0 X
0.6 (For example, in the version of ) 117 604.67 P
9 F
1.32 (min:) 255.8 604.67 P
3 F
0.6 ( customized for integers, the compiler can) 279.79 604.67 P
(statically look up the de\336nition of ) 108 592.67 T
9 F
(<) 259.37 592.67 T
3 F
( de\336ned for integers:) 265.37 592.67 T
17 F
(< arg = \050 _IntLTPrim: arg IfFail: [...] \051.) 126 578.33 T
3 F
2.41 (This method simply calls the integer less-than primitive with a failure block) 108 563.67 P
0.81 (\050omitted here for brevity\051. The compiler inlines this ) 108 551.67 P
9 F
1.76 (<) 344.23 551.67 P
3 F
0.81 ( method to get to the \337ow) 350.23 551.67 P
(graph below:) 108 539.67 T
-0.55 (The overhead for sending the ) 117 273.27 P
9 F
-1.19 (<) 245.77 273.27 P
3 F
-0.55 ( message has been eliminated, but calling a proce-) 251.77 273.27 P
1.55 (dure to compare integers is still expensive. The next section explains how our) 108 261.27 P
2.2 (compiler open-codes common primitive built-in operations to further increase) 108 249.27 P
(performance.) 108 237.27 T
8 F
(5.3) 108 213.24 T
(Primitive Inlining) 135 213.24 T
5 F
0.01 (Primitive inlining) 117 194.6 P
3 F
0.01 ( can be viewed as a simpler form of message inlining. Calls to) 194.83 194.6 P
-0.31 (primitive operations are normally implemented using a simple procedure call to an) 108 182.6 P
1.32 (external function in the virtual machine. However) 108 170.6 P
1.32 (, like most other high-perfor-) 334.86 170.6 P
1.27 (mance systems, including some Smalltalk systems [1) 108 158.6 P
1.27 (1, 12], our S) 348.7 158.6 P
4 F
1.16 (ELF) 407.15 158.6 P
3 F
1.27 ( compiler) 424.92 158.6 P
0.48 (replaces calls of certain common primitives, such as integer arithmetic, compari-) 108 146.6 P
2.64 (sons, and array accesses, with their hard-wired de\336nitions. This signi\336cantly) 108 134.6 P
0.3 (improves performance since some of these primitives can be implemented in two) 108 122.6 P
0.47 (or three machine instructions if the overhead of the procedure call is removed. If) 108 110.6 P
0.26 (the ar) 108 98.6 P
0.26 (guments to a side-ef) 132.77 98.6 P
0.26 (fect-free primitive, such as an arithmetic or comparison) 222.13 98.6 P
108 89 468 612 C
168 284.6 408 536 C
168 284.6 408 536 R
7 X
0 K
V
218 411.98 356 487.98 R
4 X
V
0.5 H
0 Z
N
288 524.98 288 300.98 2 L
V
1 H
2 Z
0 X
N
221 415.98 352 433.98 R
7 X
V
0.5 H
0 Z
0 X
N
261 490.98 315 508.98 R
7 X
V
0 X
N
257 515.98 320 533.98 R
7 X
V
0 X
N
252 390.98 324 408.98 R
7 X
V
0 X
N
252 365.98 324 383.98 R
7 X
V
0 X
N
257 340.98 320 358.98 R
7 X
V
0 X
N
252 315.98 324 333.98 R
7 X
V
0 X
N
234 290.98 342 308.98 R
7 X
V
0 X
N
12 F
(call) 225.28 420.98 T
4 F
( ) 240.28 420.98 T
17 F
(_IntLTPrim:IfFail:) 242.77 420.98 T
4 F
(push ) 265.32 520.98 T
17 F
(self) 286.7 520.98 T
4 F
(push ) 268 495.98 T
17 F
(arg) 289.38 495.98 T
12 F
(send) 239.05 295.98 T
4 F
( ) 258.49 295.98 T
17 F
(ifTrue:False:) 260.99 295.98 T
4 F
(push ) 262 395.98 T
17 F
([self]) 283.38 395.98 T
4 F
(push ) 264 346.98 T
17 F
([arg]) 285.38 346.98 T
12 F
(create-closure) 258 370.98 T
(create-closure) 257 320.98 T
257 465.98 320 483.98 R
7 X
V
0 X
N
252 440.98 324 458.98 R
7 X
V
0 X
N
4 F
(push ) 264 470.98 T
17 F
([...]) 285.38 470.98 T
12 F
(create-closure) 258 445.98 T
108 89 468 612 C
0 0 612 792 C
FMENDPAGE
%%EndPage: "75" 20
%%Page: "76" 20
612 792 0 FMBEGINPAGE
108 630 468 648 R
7 X
0 K
V
7 F
0 X
(76) 108 641.33 T
(CHAMBERS, UNGAR, AND LEE) 332.8 641.33 T
108 89 468 612 R
7 X
V
3 F
0 X
0.47 (primitive, are known at compile-time, the compiler actually calls the primitive at) 108 604.67 P
-0.66 (compile-time, replacing the call to the primitive with the result of the primitive; this) 108 592.67 P
(is S) 108 580.67 T
4 F
(ELF) 124.18 580.67 T
3 F
(\325) 141.95 580.67 T
(s form of ) 145.01 580.67 T
5 F
(constant folding) 188.03 580.67 T
3 F
(.) 259.14 580.67 T
-0.07 (In our ongoing ) 117 565.67 P
9 F
-0.15 (min:) 184.84 565.67 P
3 F
-0.07 ( example, the compiler inlines the ) 208.82 565.67 P
9 F
-0.15 (_IntLTPrim:IfFail:) 360.06 565.67 P
3 F
0.48 (call \050the de\336nition of the integer less-than primitive, but not the integer less-than) 108 553.67 P
(method, is hard-wired into the compiler\051 to get the following \337ow graph: ) 108 541.67 T
3.93 (The \336rst compare-and-branch sequence veri\336es that the ar) 117 252.28 P
3.93 (gument to the) 399.7 252.28 P
9 F
-0.66 (_IntLTPrim:IfFail:) 108 240.53 P
3 F
-0.3 ( call is also an integer \050the receiver is already known to be) 215.94 240.53 P
2.21 (an integer courtesy of customization\051; if not, the failure block is created and) 108 228.78 P
1.13 (invoked. If the ar) 108 217.03 P
1.13 (gument is an integer) 186.85 217.03 P
1.13 (, then the two integers are compared, and) 279.19 217.03 P
2.04 (either the ) 108 205.28 P
9 F
4.46 (true) 156.02 205.28 P
3 F
2.04 ( object or the ) 180 205.28 P
9 F
4.46 (false) 248.58 205.28 P
3 F
2.04 ( object is returned as the result of the ) 278.56 205.28 P
9 F
4.46 (<) 462 205.28 P
3 F
(message.) 108 193.53 T
-0.06 (The next message considered by our compiler is the ) 117 178.78 P
9 F
-0.14 (ifTrue:False:) 347.39 178.78 P
3 F
-0.06 ( message.) 425.35 178.78 P
0.01 (If ) 108 167.03 P
9 F
0.03 (arg) 118.08 167.03 P
3 F
0.01 ( is an integer\321the common case\321the receiver of ) 136.07 167.03 P
9 F
0.03 (ifTrue:False:) 357.06 167.03 P
3 F
0.01 ( will be) 435.02 167.03 P
2.25 (either ) 108 155.28 P
9 F
4.9 (true) 138.01 155.28 P
3 F
2.25 ( or ) 161.99 155.28 P
9 F
4.9 (false) 181.13 155.28 P
3 F
2.25 (; otherwise it will be the result of the ) 211.12 155.28 P
9 F
4.9 (value) 395.8 155.28 P
3 F
2.25 ( message) 425.79 155.28 P
4.51 (\050unknown at compile-time\051. Normally) 108 143.53 P
4.51 (, this would prevent inlining of the) 288.65 143.53 P
9 F
-0.34 (ifTrue:False:) 108 131.78 P
3 F
-0.16 ( message, since the type of its receiver cannot be uniquely deter-) 185.96 131.78 P
4.49 (mined. However) 108 120.03 P
4.49 (, by compiling multiple versions of the ) 185.27 120.03 P
9 F
9.8 (ifTrue:False:) 390.04 120.03 P
3 F
0.36 (message, one version for each statically-known receiver type, our S) 108 108.28 P
4 F
0.32 (ELF) 408.07 108.28 P
3 F
0.36 ( compiler) 425.84 108.28 P
(can handle and optimize each case separately) 108 96.53 T
(. This technique is explained next.) 306.19 96.53 T
108 89 468 612 C
168 263.62 408 538 C
168 263.62 408 538 R
7 X
0 K
V
172 403.98 402 534.98 R
4 X
V
1 H
0 Z
N
206 409.98 304 372.98 2 L
V
2 Z
0 X
N
364 410.98 263 368.98 2 L
4 X
V
0 X
N
271 460.98 292 420.98 2 L
4 X
V
0 X
N
223 456.98 203 421.98 2 L
4 X
V
0 X
N
286 503.98 377 470.98 2 L
4 X
V
0 X
N
277 509.98 240 465.98 2 L
4 X
V
0 X
N
288 418.98 288 269.98 2 L
4 X
V
0 X
N
362 466.98 362 418.98 2 L
4 X
V
0 X
N
252 368.92 324 386.92 R
7 X
V
0.5 H
0 Z
0 X
N
252 343.92 324 361.92 R
7 X
V
0 X
N
257 318.92 320 336.92 R
7 X
V
0 X
N
252 293.92 324 311.92 R
7 X
V
0 X
N
234 268.92 342 286.92 R
7 X
V
0 X
N
12 F
(send) 239.05 273.92 T
4 F
( ) 258.49 273.92 T
17 F
(ifTrue:False:) 260.99 273.92 T
4 F
(push ) 262 373.92 T
17 F
([self]) 283.38 373.92 T
4 F
(push ) 264 324.92 T
17 F
([arg]) 285.38 324.92 T
12 F
(create-closure) 258 348.92 T
(create-closure) 257 298.92 T
257 409.98 320 427.98 R
7 X
V
0 X
N
4 F
(push ) 262.32 414.98 T
17 F
(false) 283.7 414.98 T
257 493.98 320 529.98 R
7 X
V
0 X
N
4 F
(and #3, ) 263 514.98 T
17 F
(arg) 294.92 514.98 T
4 F
(bzero) 263 500.98 T
176 409.98 239 427.98 R
7 X
V
0 X
N
(push ) 184.32 414.98 T
17 F
(true) 205.7 414.98 T
208 440.98 289 476.98 R
7 X
V
0 X
N
4 F
(cmp ) 215 461.98 T
17 F
(self) 234.71 461.98 T
4 F
(, ) 258.7 461.98 T
17 F
(arg) 263.69 461.98 T
4 F
(branch-less-than) 215 447.98 T
331 459.98 394 477.98 R
7 X
V
0 X
N
326 434.98 398 452.98 R
7 X
V
0 X
N
(push ) 338 464.98 T
17 F
([...]) 359.38 464.98 T
12 F
(create-closure) 332 439.98 T
331 409.98 394 427.98 R
7 X
V
0 X
N
(send) 336 414.98 T
4 F
( ) 355.44 414.98 T
17 F
(value) 357.94 414.98 T
108 89 468 612 C
0 0 612 792 C
FMENDPAGE
%%EndPage: "76" 21
%%Page: "77" 21
612 792 0 FMBEGINPAGE
108 630 468 648 R
7 X
0 K
V
7 F
0 X
(AN EFFICIENT IMPLEMENTATION OF S) 108 641.33 T
0 F
(ELF) 284.01 641.33 T
7 F
(77) 458.01 641.33 T
108 89 468 612 R
7 X
V
8 F
0 X
(5.4) 108 604.64 T
(Message Splitting) 135 604.64 T
3 F
2.11 (When type information is lost because the \337ow of control mer) 117 586 P
2.11 (ges \050such as) 410.69 586 P
1.38 (happens just prior to the ) 108 574 P
9 F
3.01 (ifTrue:False:) 223.84 574 P
3 F
1.38 ( message in the ) 301.79 574 P
9 F
3.01 (min:) 377.49 574 P
3 F
1.38 ( example\051, our) 401.48 574 P
0.82 (S) 108 562 P
4 F
0.75 (ELF) 114.11 562 P
3 F
0.82 ( compiler may elect to ) 131.88 562 P
5 F
0.82 (split) 236.97 562 P
3 F
0.82 ( the message following the mer) 255.9 562 P
0.82 (ge into separate) 397.41 562 P
-0.56 (messages at the end of each of the preceding branches; the mer) 108 550 P
-0.56 (ge is postponed until) 378.41 550 P
-0.49 (after the split message. The compiler knows the type of the receiver for some of the) 108 538 P
-0.61 (copies of the message, and can perform compile-time message lookup and message) 108 526 P
-0.46 (inlining to radically improve performance for these versions. The proper semantics) 108 514 P
-0.64 (of the original unsplit message is preserved by compiling a real message send along) 108 502 P
0.27 (those branches with unknown receiver types. Message splitting can be thought of) 108 490 P
1.01 (as an extension to customized compilation, by customizing individual messages) 108 478 P
-0.04 (along particular control \337ow paths, with similar improvements in run-time perfor-) 108 466 P
(mance.) 108 454 T
2.71 (For the ) 117 439 P
9 F
5.92 (min:) 156.6 439 P
3 F
2.71 ( example, the S) 180.59 439 P
4 F
2.47 (ELF) 256.47 439 P
3 F
2.71 ( compiler will split the ) 274.24 439 P
9 F
5.92 (ifTrue:False:) 390.04 439 P
3 F
(message into three separate versions:) 108 427 T
108 89 468 612 C
168 99.33 408 423.33 C
168 99.33 408 423.33 R
7 X
0 K
V
170 137.61 403 272.61 R
4 X
V
1 H
0 Z
N
364 141.61 288 121.61 2 L
V
2 Z
0 X
N
208 141.61 288 121.61 2 L
4 X
V
0 X
N
363 333.61 363 158.61 2 L
4 X
V
0 X
N
288 285.61 288 122.61 2 L
4 X
V
0 X
N
208 285.61 208 161.61 2 L
4 X
V
0 X
N
252 251.61 324 269.61 R
7 X
V
0.5 H
0 Z
0 X
N
252 226.61 324 244.61 R
7 X
V
0 X
N
257 201.61 320 219.61 R
7 X
V
0 X
N
252 176.61 324 194.61 R
7 X
V
0 X
N
4 F
(push ) 262 256.61 T
17 F
([self]) 283.38 256.61 T
4 F
(push ) 264 207.61 T
17 F
([arg]) 285.38 207.61 T
12 F
(create-closure) 258 231.61 T
(create-closure) 257 181.61 T
172 251.61 244 269.61 R
7 X
V
0 X
N
172 226.61 244 244.61 R
7 X
V
0 X
N
177 201.61 240 219.61 R
7 X
V
0 X
N
172 176.61 244 194.61 R
7 X
V
0 X
N
4 F
(push ) 182 256.61 T
17 F
([self]) 203.38 256.61 T
4 F
(push ) 184 207.61 T
17 F
([arg]) 205.38 207.61 T
12 F
(create-closure) 178 231.61 T
(create-closure) 177 181.61 T
327 251.61 399 269.61 R
7 X
V
0 X
N
327 226.61 399 244.61 R
7 X
V
0 X
N
332 201.61 395 219.61 R
7 X
V
0 X
N
327 176.61 399 194.61 R
7 X
V
0 X
N
4 F
(push ) 337 256.61 T
17 F
([self]) 358.38 256.61 T
4 F
(push ) 339 207.61 T
17 F
([arg]) 360.38 207.61 T
12 F
(create-closure) 333 231.61 T
(create-closure) 332 181.61 T
272 327.61 293 288.61 2 L
7 X
V
1 H
2 Z
0 X
N
224 323.61 204 288.61 2 L
7 X
V
0 X
N
287 370.61 378 337.61 2 L
7 X
V
0 X
N
278 376.61 241 332.61 2 L
7 X
V
0 X
N
257 276.61 320 294.61 R
7 X
V
0.5 H
0 Z
0 X
N
4 F
(push ) 262.32 281.61 T
17 F
(false) 283.7 281.61 T
257 360.61 320 396.61 R
7 X
V
0 X
N
4 F
(and #3, ) 263 381.61 T
17 F
(arg) 294.92 381.61 T
4 F
(bzero) 263 367.61 T
177 276.61 240 294.61 R
7 X
V
0 X
N
(push ) 185.32 281.61 T
17 F
(true) 206.7 281.61 T
209 307.61 290 343.61 R
7 X
V
0 X
N
4 F
(cmp ) 216 328.61 T
17 F
(self) 235.71 328.61 T
4 F
(, ) 259.7 328.61 T
17 F
(arg) 264.69 328.61 T
4 F
(blt) 216 314.61 T
332 326.61 395 344.61 R
7 X
V
0 X
N
327 301.61 399 319.61 R
7 X
V
0 X
N
(push ) 339 331.61 T
17 F
([...]) 360.38 331.61 T
12 F
(create-closure) 333 306.61 T
332 276.61 395 294.61 R
7 X
V
0 X
N
(send) 337 281.61 T
4 F
( ) 356.44 281.61 T
17 F
(value) 358.94 281.61 T
172 141.61 244 169.61 R
7 X
V
0 X
N
12 F
(send) 178.09 156.61 T
4 F
( ) 197.52 156.61 T
17 F
(ifTrue:) 200.02 156.61 T
(False:) 206.02 145.61 T
252 141.61 324 169.61 R
7 X
V
0 X
N
12 F
(send) 258.08 156.61 T
4 F
( ) 277.52 156.61 T
17 F
(ifTrue:) 280.02 156.61 T
(False:) 286.02 145.61 T
327 141.61 399 169.61 R
7 X
V
0 X
N
12 F
(send) 333.08 156.61 T
4 F
( ) 352.52 156.61 T
17 F
(ifTrue:) 355.02 156.61 T
(False:) 361.02 145.61 T
108 89 468 612 C
0 0 612 792 C
FMENDPAGE
%%EndPage: "77" 22
%%Page: "78" 22
612 792 0 FMBEGINPAGE
108 630 468 648 R
7 X
0 K
V
7 F
0 X
(78) 108 641.33 T
(CHAMBERS, UNGAR, AND LEE) 332.8 641.33 T
108 89 468 612 R
7 X
V
3 F
0 X
1.25 (Now the compiler can inline the de\336nition of ) 117 604.67 P
9 F
2.74 (ifTrue:False:) 327.82 604.67 P
3 F
1.25 ( for the ) 405.78 604.67 P
9 F
2.74 (true) 444.01 604.67 P
3 F
(object:) 108 592.67 T
17 F
(ifTrue: trueBlk False: falseBlk = \050 trueBlk value \051.) 126 578.33 T
3 F
(and for the ) 108 563.67 T
9 F
(false) 158.34 563.67 T
3 F
( object:) 188.32 563.67 T
17 F
(ifTrue: trueBlk False: falseBlk = \050 falseBlk value \051.) 126 549.33 T
3 F
(to get to the following \337ow graph:) 108 534.67 T
0.54 (The two ) 117 230.02 P
9 F
1.18 (value) 157.14 230.02 P
3 F
0.54 ( messages can be inlined, replaced by the bodies of the blocks.) 187.12 230.02 P
3.63 (Since none of the receiver and ar) 108 218.02 P
3.63 (guments of the inlined ) 274.2 218.02 P
9 F
7.93 (ifTrue:False:) 390.04 218.02 P
3 F
0.63 (messages need to be created at run-time any more, the compiler eliminates them) 108 206.02 P
(from the control \337ow graph, producing the \337ow graph at the top of the next page.) 108 194.02 T
1.18 (Let\325) 117 179.02 P
1.18 (s assume that the failure block for integer comparisons is too complex to) 134.7 179.02 P
1.48 (inline away) 108 167.02 P
1.48 (. The compiler won\325) 159.72 167.02 P
1.48 (t inline the ) 253.67 167.02 P
9 F
3.24 (value) 307.87 167.02 P
3 F
1.48 ( message, and so the ) 337.85 167.02 P
9 F
3.24 (value) 438.02 167.02 P
3 F
0.78 (message\325) 108 155.02 P
0.78 (s result type is unknown at compile-time. Thus the receiver type of the) 148.28 155.02 P
9 F
0.78 (ifTrue:False:) 108 143.02 P
3 F
0.36 ( message is unknown, and a simple S) 185.96 143.02 P
4 F
0.32 (ELF) 352.02 143.02 P
3 F
0.36 ( compiler wouldn\325) 369.79 143.02 P
0.36 (t be) 451.47 143.02 P
1.12 (able to inline this message away either) 108 131.02 P
1.12 (. However) 283.75 131.02 P
1.12 (, the next subsection describes) 330.19 131.02 P
0.3 (how our compiler uses known patterns of usage to predict that the receiver of the) 108 119.02 P
9 F
1.76 (ifTrue:False:) 108 107.02 P
3 F
0.81 ( message will be a boolean and optimizes the message accord-) 185.96 107.02 P
(ingly) 108 95.02 T
(.) 129.87 95.02 T
108 89 468 612 C
168 241.35 408 531 C
168 241.35 408 531 R
7 X
0 K
V
169 273.59 326 298.59 R
4 X
V
1 H
0 Z
N
364 266.59 287 247.59 2 L
V
2 Z
0 X
N
205 277.59 287 247.59 2 L
4 X
V
0 X
N
363 459.59 363 284.59 2 L
4 X
V
0 X
N
288 410.59 287 247.59 2 L
4 X
V
0 X
N
208 411.59 208 287.59 2 L
4 X
V
0 X
N
252 377.59 324 395.59 R
7 X
V
0.5 H
0 Z
0 X
N
252 352.59 324 370.59 R
7 X
V
0 X
N
257 327.59 320 345.59 R
7 X
V
0 X
N
252 302.59 324 320.59 R
7 X
V
0 X
N
252 277.59 324 295.59 R
7 X
V
0 X
N
17 F
([arg] value) 255.02 282.59 T
4 F
(push ) 262 382.59 T
17 F
([self]) 283.38 382.59 T
4 F
(push ) 264 333.59 T
17 F
([arg]) 285.38 333.59 T
12 F
(create-closure) 258 357.59 T
(create-closure) 257 307.59 T
172 377.59 244 395.59 R
7 X
V
0 X
N
172 352.59 244 370.59 R
7 X
V
0 X
N
177 327.59 240 345.59 R
7 X
V
0 X
N
172 302.59 244 320.59 R
7 X
V
0 X
N
4 F
(push ) 182 382.59 T
17 F
([self]) 203.38 382.59 T
4 F
(push ) 184 333.59 T
17 F
([arg]) 205.38 333.59 T
12 F
(create-closure) 178 357.59 T
(create-closure) 177 307.59 T
327 377.59 399 395.59 R
7 X
V
0 X
N
327 352.59 399 370.59 R
7 X
V
0 X
N
332 327.59 395 345.59 R
7 X
V
0 X
N
327 302.59 399 320.59 R
7 X
V
0 X
N
4 F
(push ) 337 382.59 T
17 F
([self]) 358.38 382.59 T
4 F
(push ) 339 333.59 T
17 F
([arg]) 360.38 333.59 T
12 F
(create-closure) 333 357.59 T
(create-closure) 332 307.59 T
272 453.59 293 414.59 2 L
7 X
V
1 H
2 Z
0 X
N
224 449.59 204 414.59 2 L
7 X
V
0 X
N
287 496.59 378 463.59 2 L
7 X
V
0 X
N
278 502.59 241 458.59 2 L
7 X
V
0 X
N
257 402.59 320 420.59 R
7 X
V
0.5 H
0 Z
0 X
N
4 F
(push ) 262.32 407.59 T
17 F
(false) 283.7 407.59 T
257 486.59 320 522.59 R
7 X
V
0 X
N
4 F
(and #3, ) 263 507.59 T
17 F
(arg) 294.92 507.59 T
4 F
(bzero) 263 493.59 T
177 402.59 240 420.59 R
7 X
V
0 X
N
(push ) 185.32 407.59 T
17 F
(true) 206.7 407.59 T
209 433.59 290 469.59 R
7 X
V
0 X
N
4 F
(cmp ) 216 454.59 T
17 F
(self) 235.71 454.59 T
4 F
(, ) 259.7 454.59 T
17 F
(arg) 264.69 454.59 T
4 F
(blt) 216 440.59 T
332 452.59 395 470.59 R
7 X
V
0 X
N
327 427.59 399 445.59 R
7 X
V
0 X
N
(push ) 339 457.59 T
17 F
([...]) 360.38 457.59 T
12 F
(create-closure) 333 432.59 T
332 402.59 395 420.59 R
7 X
V
0 X
N
(send) 337 407.59 T
4 F
( ) 356.44 407.59 T
17 F
(value) 358.94 407.59 T
172 277.59 247 295.59 R
7 X
V
0 X
N
([self] value) 173.02 282.59 T
327 267.59 399 295.59 R
7 X
V
0 X
N
12 F
(send) 333.08 282.59 T
4 F
( ) 352.52 282.59 T
17 F
(ifTrue:) 355.02 282.59 T
(False:) 361.02 271.59 T
108 89 468 612 C
0 0 612 792 C
FMENDPAGE
%%EndPage: "78" 23
%%Page: "79" 23
612 792 0 FMBEGINPAGE
108 630 468 648 R
7 X
0 K
V
7 F
0 X
(AN EFFICIENT IMPLEMENTATION OF S) 108 641.33 T
0 F
(ELF) 284.01 641.33 T
7 F
(79) 458.01 641.33 T
108 89 468 612 R
7 X
V
8 F
0 X
(5.5) 108 298.34 T
(T) 135 298.34 T
(ype Pr) 141.51 298.34 T
(ediction) 172.13 298.34 T
3 F
1.28 (When the type of the receiver of a message is unknown at compile-time, the) 117 279.7 P
-0.64 (S) 108 267.7 P
4 F
-0.58 (ELF) 114.11 267.7 P
3 F
-0.64 ( compiler uses ) 131.88 267.7 P
5 F
-0.64 (static type pr) 196.18 267.7 P
-0.64 (ediction) 251.87 267.7 P
3 F
-0.64 ( to generate better code for some common) 287.27 267.7 P
0.67 (situations. Certain messages are known to the compiler to be likely to be sent to) 108 255.7 P
3.7 (receivers of certain types: ) 108 243.7 P
9 F
8.07 (+) 238.71 243.7 P
3 F
3.7 ( and ) 244.71 243.7 P
9 F
8.07 (<) 273.46 243.7 P
3 F
3.7 ( are likely to be sent to integers, and) 279.46 243.7 P
9 F
-1.05 (ifTrue:False:) 108 231.7 P
3 F
-0.48 ( is likely to be sent to either ) 185.96 231.7 P
9 F
-1.05 (true) 306.61 231.7 P
3 F
-0.48 ( or ) 330.6 231.7 P
9 F
-1.05 (false) 344.28 231.7 P
3 F
-0.48 (. The compiler gener-) 374.26 231.7 P
0.49 (ates a run-time test based on the expected type or value of the receiver) 108 219.7 P
0.49 (, followed) 422.96 219.7 P
-0.37 (by a conditional branch to one of two sections of code; along the \322success\323 branch,) 108 207.7 P
0.28 (the type \050or value\051 of the receiver is known \050at compile-time\051, along the \322failure\323) 108 195.7 P
0.71 (branch, the type is unknown. The compiler then uses the message splitting tech-) 108 183.7 P
-0.1 (niques to split the predicted message, compiling a copy of the message along each) 108 171.7 P
1.78 (branch. Because the compiler now knows the type of the receiver of the split) 108 159.7 P
-0.49 (message along the \322success\323 branch, it can inline that version of the message away) 108 147.7 P
-0.49 (,) 465.25 147.7 P
1.82 (signi\336cantly improving performance for common operations like integer arith-) 108 135.7 P
1.11 (metic and boolean testing. A real message send is executed in the case that the) 108 123.7 P
3.04 (prediction fails, preserving the original message\325) 108 111.7 P
3.04 (s semantics for all possible) 337.42 111.7 P
(receivers.) 108 99.7 T
108 89 468 612 C
168 305.7 408 612 C
168 305.7 408 612 R
7 X
0 K
V
173 480 324 507 R
4 X
V
1 H
0 Z
N
363 350 288 329 2 L
V
2 Z
0 X
N
208 351 288 329 2 L
4 X
V
0 X
N
363 542 363 367 2 L
4 X
V
0 X
N
288 493 288 329 2 L
4 X
V
0 X
N
208 494 208 353 2 L
4 X
V
0 X
N
327 460 399 478 R
7 X
V
0.5 H
0 Z
0 X
N
327 435 399 453 R
7 X
V
0 X
N
332 410 395 428 R
7 X
V
0 X
N
327 385 399 403 R
7 X
V
0 X
N
4 F
(push ) 337 465 T
17 F
([self]) 358.38 465 T
4 F
(push ) 339 416 T
17 F
([arg]) 360.38 416 T
12 F
(create-closure) 333 440 T
(create-closure) 332 390 T
272 536 293 497 2 L
7 X
V
1 H
2 Z
0 X
N
224 532 204 497 2 L
7 X
V
0 X
N
287 579 378 546 2 L
7 X
V
0 X
N
278 585 241 541 2 L
7 X
V
0 X
N
257 485 320 503 R
7 X
V
0.5 H
0 Z
0 X
N
4 F
(push ) 268.32 490 T
17 F
(arg) 289.69 490 T
257 569 320 605 R
7 X
V
0 X
N
4 F
(and #3, ) 263 590 T
17 F
(arg) 294.92 590 T
4 F
(bzero) 263 576 T
177 485 240 503 R
7 X
V
0 X
N
(push ) 185.32 490 T
17 F
(self) 206.7 490 T
209 516 290 552 R
7 X
V
0 X
N
4 F
(cmp ) 216 537 T
17 F
(self) 235.71 537 T
4 F
(, ) 259.7 537 T
17 F
(arg) 264.69 537 T
4 F
(blt) 216 523 T
332 535 395 553 R
7 X
V
0 X
N
327 510 399 528 R
7 X
V
0 X
N
(push ) 339 540 T
17 F
([...]) 360.38 540 T
12 F
(create-closure) 333 515 T
332 485 395 503 R
7 X
V
0 X
N
(send) 337 490 T
4 F
( ) 356.44 490 T
17 F
(value) 358.94 490 T
327 350 399 378 R
7 X
V
0 X
N
12 F
(send) 333.08 365 T
4 F
( ) 352.52 365 T
17 F
(ifTrue:) 355.02 365 T
(False:) 361.02 354 T
108 89 468 612 C
0 0 612 792 C
FMENDPAGE
%%EndPage: "79" 24
%%Page: "80" 24
612 792 0 FMBEGINPAGE
108 630 468 648 R
7 X
0 K
V
7 F
0 X
(80) 108 641.33 T
(CHAMBERS, UNGAR, AND LEE) 332.8 641.33 T
108 89 468 612 R
7 X
V
3 F
0 X
-0.67 (This type prediction scheme requires little additional implementation work, since) 117 604.67 P
0.32 (message splitting and inlining is already implemented. It is also much better than) 108 592.67 P
-0.64 (hard-wiring the ) 108 580.67 P
9 F
-1.39 (ifTrue:ifFalse:) 177.51 580.67 P
3 F
-0.64 (, ) 267.46 580.67 P
9 F
-1.39 (whileTrue:) 272.32 580.67 P
3 F
-0.64 (, ) 332.29 580.67 P
9 F
-1.39 (=) 337.15 580.67 P
-1.39 (=) 343.97 580.67 P
3 F
-0.64 (, ) 349.97 580.67 P
9 F
-1.39 (+) 354.83 580.67 P
3 F
-0.64 (, and ) 360.82 580.67 P
9 F
-1.39 (<) 383.65 580.67 P
3 F
-0.64 ( messages into the) 389.65 580.67 P
-0.33 (parser and compiler as Smalltalk-80 systems do, since it achieves the same sorts of) 108 568.67 P
1.32 (performance improvements but preserves the message passing semantics of the) 108 556.67 P
3.01 (language and allows the programmer to modify the de\336nitions of ) 108 544.67 P
5 F
3.01 (all) 426.76 544.67 P
3 F
3.01 ( S) 438.36 544.67 P
4 F
2.74 (ELF) 450.23 544.67 P
3 F
(methods, including those that are optimized through type prediction.) 108 532.67 T
1 (Let\325) 117 517.67 P
1 (s apply type prediction to the remaining ) 134.7 517.67 P
9 F
2.18 (ifTrue:False:) 319.61 517.67 P
3 F
1 ( message in the) 397.56 517.67 P
9 F
-0.89 (min:) 108 505.67 P
3 F
-0.41 ( example. The compiler \336rst inserts run-time tests for the ) 131.99 505.67 P
9 F
-0.89 (true) 380.86 505.67 P
3 F
-0.41 ( object and the) 404.85 505.67 P
9 F
-0.06 (false) 108 493.67 P
3 F
-0.03 ( object, followed by several copies of the ) 137.98 493.67 P
9 F
-0.06 (ifTrue:False:) 321.14 493.67 P
3 F
-0.03 ( message \050we\325ll) 399.1 493.67 P
(just look at the remaining unoptimized branch\051:) 108 481.67 T
108 89 468 612 C
168 107.03 408 478 C
168 107.03 408 478 R
7 X
0 K
V
171 146.67 404 379.67 R
4 X
V
1 H
0 Z
N
365 152.67 289 132.67 2 L
V
2 Z
0 X
N
209 152.67 290 132.67 2 L
4 X
V
0 X
N
347 296.67 372 273.67 2 L
4 X
V
0 X
N
307 299.67 280 269.67 2 L
4 X
V
0 X
N
273 348.67 200 271.67 2 L
4 X
V
0 X
N
306 341.67 339 318.67 2 L
4 X
V
0 X
N
290 272.67 290 123.67 2 L
4 X
V
0 X
N
365 266.67 365 160.67 2 L
4 X
V
0 X
N
210 164.67 210 277.67 2 L
4 X
V
0 X
N
288 463.67 288 349.67 2 L
4 X
V
0 X
N
257 434.67 320 452.67 R
7 X
V
0.5 H
0 Z
0 X
N
252 409.67 324 427.67 R
7 X
V
0 X
N
4 F
(push ) 264 439.67 T
17 F
([...]) 285.38 439.67 T
12 F
(create-closure) 258 414.67 T
257 384.67 320 402.67 R
7 X
V
0 X
N
(send) 262 389.67 T
4 F
( ) 281.44 389.67 T
17 F
(value) 283.94 389.67 T
258 338.67 318 374.67 R
7 X
V
0 X
N
4 F
(cmp ) 264 359.67 T
17 F
(#true) 283.71 359.67 T
4 F
(beq) 264 345.67 T
294 291.67 360 327.67 R
7 X
V
0 X
N
(cmp ) 300 312.67 T
17 F
(#false) 319.71 312.67 T
4 F
(beq) 300 298.67 T
254 262.67 326 280.67 R
7 X
V
0 X
N
254 237.67 326 255.67 R
7 X
V
0 X
N
259 212.67 322 230.67 R
7 X
V
0 X
N
254 187.67 326 205.67 R
7 X
V
0 X
N
(push ) 264 267.67 T
17 F
([self]) 285.38 267.67 T
4 F
(push ) 266 218.67 T
17 F
([arg]) 287.38 218.67 T
12 F
(create-closure) 260 242.67 T
(create-closure) 259 192.67 T
174 262.67 246 280.67 R
7 X
V
0 X
N
174 237.67 246 255.67 R
7 X
V
0 X
N
179 212.67 242 230.67 R
7 X
V
0 X
N
174 187.67 246 205.67 R
7 X
V
0 X
N
4 F
(push ) 184 267.67 T
17 F
([self]) 205.38 267.67 T
4 F
(push ) 186 218.67 T
17 F
([arg]) 207.38 218.67 T
12 F
(create-closure) 180 242.67 T
(create-closure) 179 192.67 T
329 262.67 401 280.67 R
7 X
V
0 X
N
329 237.67 401 255.67 R
7 X
V
0 X
N
334 212.67 397 230.67 R
7 X
V
0 X
N
329 187.67 401 205.67 R
7 X
V
0 X
N
4 F
(push ) 339 267.67 T
17 F
([self]) 360.38 267.67 T
4 F
(push ) 341 218.67 T
17 F
([arg]) 362.38 218.67 T
12 F
(create-closure) 335 242.67 T
(create-closure) 334 192.67 T
329 152.67 401 180.67 R
7 X
V
0 X
N
(send) 335.08 167.67 T
4 F
( ) 354.52 167.67 T
17 F
(ifTrue:) 357.02 167.67 T
(False:) 363.02 156.67 T
254 152.67 326 180.67 R
7 X
V
0 X
N
12 F
(send) 260.08 167.67 T
4 F
( ) 279.52 167.67 T
17 F
(ifTrue:) 282.02 167.67 T
(False:) 288.02 156.67 T
174 152.67 246 180.67 R
7 X
V
0 X
N
12 F
(send) 180.09 167.67 T
4 F
( ) 199.52 167.67 T
17 F
(ifTrue:) 202.02 167.67 T
(False:) 208.02 156.67 T
108 89 468 612 C
0 0 612 792 C
FMENDPAGE
%%EndPage: "80" 25
%%Page: "81" 25
612 792 0 FMBEGINPAGE
108 630 468 648 R
7 X
0 K
V
7 F
0 X
(AN EFFICIENT IMPLEMENTATION OF S) 108 641.33 T
0 F
(ELF) 284.01 641.33 T
7 F
(81) 458.01 641.33 T
108 89 468 612 R
7 X
V
3 F
0 X
1.24 (In the left branch, the receiver of ) 117 604.67 P
9 F
2.71 (ifTrue:False:) 272.74 604.67 P
3 F
1.24 ( is known to be the value) 350.69 604.67 P
9 F
2.81 (true) 108 592.67 P
3 F
1.29 (; for the middle branch, the receiver is known to be the value ) 131.99 592.67 P
9 F
2.81 (false) 419.03 592.67 P
3 F
1.29 (. As) 449.02 592.67 P
0.07 (before, the compiler inlines these two ) 108 580.67 P
9 F
0.16 (ifTrue:False:) 276.56 580.67 P
3 F
0.07 ( messages, plus the corre-) 354.52 580.67 P
0.27 (sponding ) 108 568.67 P
9 F
0.58 (value) 151.3 568.67 P
3 F
0.27 ( messages, and eliminates the closure creations to get to the \336nal) 181.28 568.67 P
(\337ow graph for the entire method:) 108 556.67 T
108 89 468 612 C
168 113 408 553 C
168 113 408 553 R
7 X
0 K
V
173 166 320 192 R
4 X
V
1 H
0 Z
N
285 148 207 170 2 L
V
2 Z
0 X
N
286 148 365 170 2 L
4 X
V
0 X
N
286 148 286 175 2 L
4 X
V
0 X
N
354 321 370 289 2 L
4 X
V
0 X
N
319 323 284 181 2 L
4 X
V
0 X
N
321 367 347 339 2 L
4 X
V
0 X
N
293 367 202 179 2 L
4 X
V
0 X
N
247 440 286 179 2 L
4 X
V
0 X
N
365 288 365 173 2 L
4 X
V
0 X
N
193 445 206 177 2 L
4 X
V
0 X
N
308 460 308 369 2 L
4 X
V
0 X
N
275 494 315 466 2 L
4 X
V
0 X
N
246 496 209 464 2 L
4 X
V
0 X
N
253 170 316 188 R
7 X
V
0.5 H
0 Z
0 X
N
4 F
(push ) 264.32 175 T
17 F
(arg) 285.69 175 T
230 487 293 523 R
7 X
V
0 X
N
4 F
(and #3, ) 236 508 T
17 F
(arg) 267.92 508 T
4 F
(bzero) 236 494 T
177 170 240 188 R
7 X
V
0 X
N
(push ) 185.32 175 T
17 F
(self) 206.7 175 T
180 434 261 470 R
7 X
V
0 X
N
4 F
(cmp ) 187 455 T
17 F
(self) 206.71 455 T
4 F
(, ) 230.7 455 T
17 F
(arg) 235.69 455 T
4 F
(blt) 187 441 T
277 453 340 471 R
7 X
V
0 X
N
272 428 344 446 R
7 X
V
0 X
N
(push ) 284 458 T
17 F
([...]) 305.38 458 T
12 F
(create-closure) 278 433 T
277 403 340 421 R
7 X
V
0 X
N
(send) 282 408 T
4 F
( ) 301.44 408 T
17 F
(value) 303.94 408 T
278 360 338 396 R
7 X
V
0 X
N
4 F
(cmp ) 284 381 T
17 F
(#true) 303.71 381 T
4 F
(beq) 284 367 T
304 312 370 348 R
7 X
V
0 X
N
(cmp ) 310 333 T
17 F
(#false) 329.71 333 T
4 F
(beq) 310 319 T
329 280 401 298 R
7 X
V
0 X
N
329 255 401 273 R
7 X
V
0 X
N
334 230 397 248 R
7 X
V
0 X
N
329 205 401 223 R
7 X
V
0 X
N
(push ) 339 285 T
17 F
([self]) 360.38 285 T
4 F
(push ) 341 236 T
17 F
([arg]) 362.38 236 T
12 F
(create-closure) 335 260 T
(create-closure) 334 210 T
329 170 401 198 R
7 X
V
0 X
N
(send) 335.08 185 T
4 F
( ) 354.52 185 T
17 F
(ifTrue:) 357.02 185 T
(False:) 363.02 174 T
108 89 468 612 C
0 0 612 792 C
FMENDPAGE
%%EndPage: "81" 26
%%Page: "82" 26
612 792 0 FMBEGINPAGE
108 630 468 648 R
7 X
0 K
V
7 F
0 X
(82) 108 641.33 T
(CHAMBERS, UNGAR, AND LEE) 332.8 641.33 T
108 89 468 612 R
7 X
V
3 F
0 X
2.37 (In the common case of taking the minimum of two integers, our compiler) 117 604.67 P
1.32 (executes only two simple compare-and-branch sequences, for fast execution. A) 108 592.67 P
-0.32 (similar savings will be seen if the user calls ) 108 580.67 P
9 F
-0.71 (min:) 298.86 580.67 P
3 F
-0.32 ( on two \337oating point numbers or) 322.84 580.67 P
-0.23 (two strings, since our compiler customizes and optimizes special versions for each) 108 568.67 P
0.12 (of these receiver types. But even in the case of taking the minimum of two values) 108 556.67 P
0.12 (of dif) 108 544.67 P
0.12 (ferent types, such as an integer and a \337oating point number) 132.02 544.67 P
0.12 (, our compilation) 392.39 544.67 P
-0.56 (techniques preserve the message passing semantics of the original source code, and) 108 532.67 P
(execute the source code faithfully) 108 520.67 T
(.) 255.56 520.67 T
2 F
(6) 108 487.3 T
(Supporting the Pr) 126 487.3 T
(ogramming Envir) 226.05 487.3 T
(onment) 325.01 487.3 T
3 F
0.11 (Our S) 117 464.24 P
4 F
0.1 (ELF) 143.05 464.24 P
3 F
0.11 ( system supports a high-productivity programming environment. This) 160.82 464.24 P
0.77 (environment requires both rapid turn-around time for programming changes and) 108 452.24 P
2.47 (complete source-level debugging at the byte code level. These features must) 108 440.24 P
0.09 (coexist with our optimizing compiler techniques, including message inlining. The) 108 428.24 P
0.71 (next two subsections describe the compiler) 108 416.24 P
0.71 (-maintained change dependency links) 300.2 416.24 P
-0.42 (that support incremental recompilation of compiled code af) 108 404.24 P
-0.42 (fected by programming) 365.72 404.24 P
3.57 (changes, and the compiler) 108 392.24 P
3.57 (-generated debugging information that allows the) 233.21 392.24 P
1.18 (debugger to reconstruct inlined stack frames at debug-time. This information is) 108 380.24 P
(appended to each compiled method object in the compiled code cache.) 108 368.24 T
8 F
(6.1) 108 344.21 T
(Support for Incr) 135 344.21 T
(emental Recompilation) 212.93 344.21 T
3 F
3.78 (A high-productivity programming environment requires that programming) 117 325.57 P
-0.41 (changes take ef) 108 313.57 P
-0.41 (fect within a fraction of a second) 174.71 313.57 P
5 F
-0.41 (.) 316.87 313.57 P
3 F
-0.41 ( This is accomplished in our S) 319.62 313.57 P
4 F
-0.37 (ELF) 450.23 313.57 P
3 F
0.62 (system by ) 108 301.57 P
5 F
0.62 (selectively invalidating) 156.25 301.57 P
3 F
0.62 ( only those compiled methods that are af) 258.48 301.57 P
0.62 (fected) 441.16 301.57 P
1.06 (by the programming change, recompiling them from new de\336nitions when next) 108 289.57 P
0.34 (needed. The compiler maintains two-way ) 108 277.57 P
5 F
0.34 (change dependency links) 294.59 277.57 P
3 F
0.34 ( between each) 405.1 277.57 P
0.22 (cached compiled method and the slots that the compiled method depends on. The) 108 265.57 P
-0.19 (information used to compile code\321object formats and the contents of non-assign-) 108 253.57 P
0.27 (able slots\321is precisely the information stored in maps. Therefore we can con\336ne) 108 241.57 P
(our dependency links to maps. These links are formed in four ways:) 108 229.57 T
(\245) 117 214.57 T
2.13 (When a method is being compiled, the system creates a dependency link) 126 214.57 P
-0.5 (between the map slot description containing the method and the compiled code) 126 202.57 P
(in case the de\336nition of the method changes or its slot is removed.) 126 190.57 T
(\245) 117 176.57 T
0.91 (When the compiler inlines a message, the system creates a dependency link) 126 176.57 P
0.32 (between the matching slot description \050either a method slot, a data slot, or an) 126 164.57 P
1.09 (assignment slot\051 and the compiled code in case the de\336nition of the inlined) 126 152.57 P
(method changes or its slot is removed.) 126 140.57 T
FMENDPAGE
%%EndPage: "82" 27
%%Page: "83" 27
612 792 0 FMBEGINPAGE
108 630 468 648 R
7 X
0 K
V
7 F
0 X
(AN EFFICIENT IMPLEMENTATION OF S) 108 641.33 T
0 F
(ELF) 284.01 641.33 T
7 F
(83) 458.01 641.33 T
108 89 468 612 R
7 X
V
3 F
0 X
(\245) 117 258.96 T
0.84 (When the compiler searches a parent object during the course of a compile-) 126 258.96 P
-0.42 (time lookup, the system creates a dependency link between the slot description) 126 246.96 P
-0.33 (containing the parent and the compiled code in case the parent pointer changes) 126 234.96 P
(and alters the result of the lookup.) 126 222.96 T
(\245) 117 208.96 T
2.22 (When the compiler searches an object unsuccessfully for a matching slot) 126 208.96 P
-0.49 (during compile-time lookup, the system creates a dependency link between the) 126 196.96 P
0.67 (map of the object searched and the compiled code in case a matching slot is) 126 184.96 P
(added to the object later) 126 172.96 T
(.) 230.96 172.96 T
1.38 (These rules ensure that no out-of-date compiled methods survive programming) 108 157.96 P
2.36 (changes, while limiting invalidations to those methods actually af) 108 145.96 P
2.36 (fected by a) 415.08 145.96 P
(change.) 108 133.96 T
-0.58 (A dependency link is represented by a circular list that connects a slot description) 117 118.96 P
-0.18 (or map to all dependent compiled methods. When the system changes the contents) 108 106.96 P
0.04 (of a constant slot or removes a slot, it traverses the corresponding dependency list) 108 94.96 P
108 89 468 612 C
138.76 266.29 437.24 612 C
138.76 266.29 437.24 612 R
7 X
0 K
V
189.35 422.59 261.35 590.59 R
2 X
V
0.5 H
0 Z
N
257.35 469.59 302.35 595.59 302.35 523.59 257.35 463.59 4 Y
4 X
V
1 H
N
257.35 443.59 303.35 478.59 303.35 424.59 3 Y
V
N
311.35 417.59 383.35 471.59 R
2 X
V
0.5 H
N
309.35 517.59 382.35 587.59 R
V
N
186.35 424.59 258.35 595.59 R
7 X
V
1 H
0 X
N
186.35 577.59 258.35 577.59 2 L
7 X
V
0.5 H
2 Z
0 X
N
186.35 523.59 258.35 523.59 2 L
7 X
V
0 X
N
186.35 505.59 258.35 505.59 2 L
7 X
V
0 X
N
186.35 478.59 258.35 478.59 2 L
7 X
V
0 X
N
186.35 451.59 258.35 451.59 2 L
7 X
V
0 X
N
13 F
(header) 208.36 582.59 T
(native) 210.36 554.59 T
(machine) 205.37 546.59 T
(code) 212.61 538.59 T
(scavenging info.) 189.88 511.59 T
(dependency) 197.87 492.59 T
(links) 213.36 484.59 T
(scope) 210.36 466.59 T
(descriptions) 198.38 458.59 T
(p.c.-byte code) 194.12 439.59 T
(mappings) 202.87 431.59 T
303.35 523.59 375.35 595.59 R
7 X
V
1 H
0 Z
0 X
N
303.35 569.59 375.35 569.59 2 L
7 X
V
0.5 H
2 Z
0 X
N
(caller scope) 315.38 583.59 T
(slot locations) 314.35 545.59 T
15 F
(a compiled method) 178.81 602.59 T
304.35 424.59 376.35 478.59 R
7 X
V
1 H
0 Z
0 X
N
304.35 460.59 376.35 460.59 2 L
7 X
V
0.5 H
2 Z
0 X
N
304.35 442.59 376.35 442.59 2 L
7 X
V
0 X
N
13 F
(p. c. address) 314.62 466.59 T
(scope desc. ptr.) 308.63 447.59 T
(byte code index) 308.88 430.59 T
15 F
(a scope description) 294.42 602.59 T
(a byte code mapping) 291.64 484.59 T
156.44 291.57 417.9 393.59 R
7 X
V
4 F
0 X
3.29 (A compiled method contains more than just instructions. It) 156.44 386.92 P
0.57 (includes a list of the of) 156.44 375.92 P
0.57 (fsets within the instructions of embedded) 250.44 375.92 P
0.49 (object references, used by the scavenger to modify the compiled) 156.44 364.92 P
2.65 (code if a referenced object is moved. The compiled method) 156.44 353.92 P
-0.53 (includes dependency links to support selective invalidation. It also) 156.44 342.92 P
-0.56 (includes descriptions of the inlined method scopes, which are used) 156.44 331.92 P
1.89 (to \336nd the values of local slots of the method and to display) 156.44 320.92 P
2.3 (source-level call stacks, and a bidirectional mapping between) 156.44 309.92 P
(source-level byte codes and actual program counter values.) 156.44 298.92 T
13 F
(desc. ptr.) 319.87 574.59 T
108 89 468 612 C
0 0 612 792 C
108 281.75 468 281.75 2 L
0.5 H
2 Z
0 X
0 K
N
FMENDPAGE
%%EndPage: "83" 28
%%Page: "84" 28
612 792 0 FMBEGINPAGE
108 630 468 648 R
7 X
0 K
V
7 F
0 X
(84) 108 641.33 T
(CHAMBERS, UNGAR, AND LEE) 332.8 641.33 T
108 89 468 612 R
7 X
V
108 89 468 612 C
130.96 91.7 445.04 612 C
130.96 91.7 445.04 612 R
7 X
0 K
V
178.55 513 195.55 525 R
V
0.5 H
0 Z
0 X
N
178.55 445 195.55 457 R
7 X
V
0 X
N
13 F
(root) 178.55 527 T
(integer) 178.55 467 T
208.55 495 310.55 519 R
7 X
V
0 X
N
(root map) 208.55 521 T
208.55 415 310.55 451 R
7 X
V
0 X
N
(integer traits map) 208.55 453 T
177.55 315 195.55 327 R
7 X
V
0 X
N
(true) 178.55 329 T
208.55 285 310.55 321 R
7 X
V
0 X
N
(true  map) 208.55 323 T
178.55 372 195.55 384 R
7 X
V
0 X
N
(17) 178.55 386 T
208.55 354 310.55 378 R
7 X
V
0 X
N
(integer  map) 208.55 380 T
14 F
(min:) 215.55 509 T
(parent) 216.55 311 T
(parent) 215.55 441 T
16 F
(\050map dependency\051) 215.55 498 T
14 F
(<) 215.55 429 T
16 F
(\050map dependency\051) 215.55 418 T
208.55 507 310.55 507 2 L
7 X
V
2 Z
0 X
N
208.55 439 310.55 439 2 L
7 X
V
0 X
N
310.55 427 208.55 427 2 L
7 X
V
0 X
N
14 F
(parent) 215.55 368 T
16 F
(\050map dependency\051) 215.55 357 T
208.55 366 310.55 366 2 L
7 X
V
0 X
N
14 F
(ifTrue:False:) 216.55 299 T
16 F
(\050map dependency\051) 216.55 288 T
208.55 309 310.55 309 2 L
7 X
V
0 X
N
208.55 297 310.55 297 2 L
7 X
V
0 X
N
292.55 519 292.55 495 2 L
7 X
V
0 X
N
292.55 451 292.55 415 2 L
7 X
V
0 X
N
292.55 378 292.55 354 2 L
7 X
V
0 X
N
292.55 321 292.55 285 2 L
7 X
V
0 X
N
177.55 246 195.55 259 R
7 X
V
0 Z
0 X
N
13 F
(false) 177.55 261 T
207.55 217 309.55 253 R
7 X
V
0 X
N
(false  map) 207.55 255 T
14 F
(parent) 215.55 243 T
(ifTrue:False:) 215.55 231 T
16 F
(\050map dependency\051) 215.55 220 T
207.55 241 309.55 241 2 L
7 X
V
2 Z
0 X
N
207.55 229 309.55 229 2 L
7 X
V
0 X
N
291.55 253 291.55 217 2 L
7 X
V
0 X
N
13 F
(traits) 178.55 458 T
204.08 521 207.55 519 204.08 517 3 L
1 H
0 Z
N
189.55 519 207.55 519 2 L
7 X
V
2 Z
0 X
N
204.08 453 207.55 451 204.08 449 3 L
0 Z
N
189.55 451 207.55 451 2 L
7 X
V
2 Z
0 X
N
204.08 380 207.55 378 204.08 376 3 L
0 Z
N
189.55 378 207.55 378 2 L
7 X
V
2 Z
0 X
N
204.08 323 207.55 321 204.08 319 3 L
0 Z
N
189.55 321 207.55 321 2 L
7 X
V
2 Z
0 X
N
203.08 255 206.55 253 203.08 251 3 L
0 Z
N
188.55 253 206.55 253 2 L
7 X
V
2 Z
0 X
N
174.08 521 177.55 519 174.08 517 3 L
0 Z
N
165.55 519 177.55 519 2 L
7 X
V
2 Z
0 X
N
90 180 6 6 165.55 513 A
159.55 512 159.55 282 2 L
N
180 270 6 6 195.55 408 A
187.55 440.54 189.55 444 191.55 440.54 3 L
0 Z
N
189.55 408 189.55 444 2 L
2 Z
N
165.55 342 297.55 342 2 L
N
0 90 6 6 297.55 336 A
303.55 315 303.55 337 2 L
N
180 270 6 6 165.55 348 A
165.55 276 296.55 276 2 L
N
0 90 6 6 295.55 270 A
301.55 246 301.55 270 2 L
N
180 270 6 6 165.55 282 A
165.55 480 297.55 480 2 L
N
180 270 6 6 165.55 486 A
0 Z
90 450 66 21 273.55 567 A
6 F
(compiled code for integer ) 204.06 593 T
17 F
(min:) 319.05 593 T
303.55 512 321.55 512 2 L
3 H
2 Z
3 X
N
303.55 432 321.55 432 2 L
N
303.55 359 321.55 359 2 L
N
303.55 372 321.55 372 2 L
N
303.55 302 321.55 302 2 L
N
302.55 234 321.55 234 2 L
N
321.55 568 321.55 234 2 L
N
311.55 568 321.55 568 2 L
N
13 F
0 X
(dependency lists) 240.08 565 T
1 F
(in case ) 327.24 431.41 T
14 F
(<) 354.19 431.41 T
1 F
( is changed) 358.86 431.41 T
(in case parent change affects) 327.24 377.06 T
14 F
(<) 327.24 369 T
1 F
( or ) 331.91 369 T
14 F
(min:) 343.89 369 T
1 F
( lookups) 358.99 369 T
(in case ) 327.24 356 T
14 F
(<) 354.19 356 T
1 F
( or ) 358.86 356 T
14 F
(min:) 370.84 356 T
1 F
( is added) 385.94 356 T
(in case ) 327.24 231.7 T
14 F
(ifTrue:False: ) 354.19 231.7 T
1 F
(is changed) 400.85 231.7 T
195.55 402 297.55 402 2 L
1 H
N
0 90 6 6 297.55 396 A
303.55 372 303.55 396 2 L
N
145.61 116 425.08 199 R
7 X
V
4 F
0 X
0.87 (The dependency lists for the compiled ) 145.61 192.33 P
18 F
1.87 (min:) 306.25 192.33 P
4 F
0.87 ( method customized for) 327.82 192.33 P
2.81 (integers. The gray line represents eight separate circularly-linked) 145.61 181.33 P
-0.06 (dependency lists. Each list connects a slot description to its dependent) 145.61 170.33 P
1.28 (compiled code objects. If any of the map information linked to the) 145.61 159.33 P
-0.42 (compiled code changes, the compiled code for ) 145.61 148.33 P
18 F
-0.92 (min:) 330.83 148.33 P
4 F
-0.42 ( \050and for any other) 352.39 148.33 P
-0.01 (compiled methods that depend on the same changed information\051 will) 145.61 137.33 P
(be thrown away and recompiled when next needed.) 145.61 126.33 T
303.55 420 321.55 420 2 L
7 X
V
3 H
3 X
N
1 F
0 X
(in case ) 327.24 417.76 T
13 F
(min:) 354.19 417.76 T
1 F
( is added) 371.17 417.76 T
303.55 444 321.55 444 2 L
7 X
V
3 X
N
1 H
0 X
0 90 6 7 297.55 473 A
303.55 444 303.55 473 2 L
N
(in case parent change affects) 327.24 449.89 T
14 F
(min:) 327.24 442.83 T
1 F
( lookup) 342.34 442.83 T
(in case ) 327.24 299.45 T
14 F
(ifTrue:False: ) 354.19 299.45 T
1 F
(is changed) 400.85 299.45 T
(in case ) 327.24 510.1 T
13 F
(min:) 354.19 510.1 T
1 F
( is added) 371.17 510.1 T
108 89 468 612 C
0 0 612 792 C
FMENDPAGE
%%EndPage: "84" 29
%%Page: "85" 29
612 792 0 FMBEGINPAGE
108 630 468 648 R
7 X
0 K
V
7 F
0 X
(AN EFFICIENT IMPLEMENTATION OF S) 108 641.33 T
0 F
(ELF) 284.01 641.33 T
7 F
(85) 458.01 641.33 T
108 89 468 612 R
7 X
V
3 F
0 X
-0.01 (and invalidates all compiled code objects on the list. When the system adds a slot,) 108 604.67 P
1.09 (it similarly traverses the map\325) 108 592.67 P
1.09 (s dependency list and invalidates linked compiled) 242.97 592.67 P
-0.19 (code objects. Links must be removed from their lists when a method is invalidated) 108 580.67 P
(or a map is garbage-collected; lists are doubly-linked to speed these removals.) 108 568.67 T
2.02 (Selective invalidation is complicated by methods that are executing when a) 117 553.67 P
0.03 (programming change requires that they be invalidated. The methods cannot really) 108 541.67 P
-0.05 (be \337ushed, because they are still executing, and some code must exist. But neither) 108 529.67 P
0.16 (can they remain untouched, since they have been optimized based on information) 108 517.67 P
-0.43 (that is no longer correct. One solution, which has not been implemented yet, would) 108 505.67 P
-0.2 (be to recompile executing methods immediately and to rebuild the execution stack) 108 493.67 P
-0.27 (for the new compiled methods. W) 108 481.67 P
-0.27 (e do not know yet if this procedure would be fast) 255.28 481.67 P
(enough to keep programming turn-around time short.) 108 469.67 T
8 F
(6.2) 108 445.64 T
(Support for Sour) 135 445.64 T
(ce-Level Debugging) 215.38 445.64 T
3 F
0.96 (A good programming environment must include a source-level debugger) 117 427 P
0.96 (. The) 444.46 427 P
-0.19 (S) 108 415 P
4 F
-0.17 (ELF) 114.11 415 P
3 F
-0.19 ( debugger presents the program execution state in terms of the programmer) 131.88 415 P
-0.19 (\325) 460.67 415 P
-0.19 (s) 463.73 415 P
-0.22 (execution model: the state of the byte code interpreter) 108 403 P
-0.22 (, with ) 342.54 403 P
5 F
-0.22 (no ) 369.87 403 P
3 F
-0.22 (optimizations. This) 383.38 403 P
-0 (requires that the debugger be able to examine the state of the compiled, optimized) 108 391 P
0.07 (S) 108 379 P
4 F
0.07 (ELF) 114.11 379 P
3 F
0.07 ( program, and construct a view of that state \050the ) 131.88 379 P
5 F
0.07 (virtual ) 345.27 379 P
3 F
0.07 (state\051 in terms of the) 377.39 379 P
1.89 (byte-coded execution model. Examining the execution state is complicated by) 108 367 P
-0.31 (having methods in the virtual call stack actually be inlined within other methods in) 108 355 P
0.65 (the compiled method call stack, and by allocating the slots of virtual methods to) 108 343 P
-0.17 (registers and/or stack locations in the compiled methods. T) 108 331 P
-0.17 (o allow the debugger to) 364.94 331 P
0.32 (reconstruct the virtual call stack from the physical optimized call stack, the S) 108 319 P
4 F
0.29 (ELF) 450.23 319 P
3 F
-0.65 (compiler appends debugging information to each compiled method. For each scope) 108 307 P
-0.26 (compiled \050the initial method, and any methods or block methods inlined within it\051,) 108 295 P
0.8 (the compiler outputs information describing that scope\325) 108 283 P
0.8 (s place in the virtual call) 356.3 283 P
0.29 (chain within the compiled method\325) 108 271 P
0.29 (s physical stack frame. For each ar) 262.36 271 P
0.29 (gument and) 416.14 271 P
0.93 (local slot in the scope, the compiler outputs either the value of the slot \050if it\325) 108 259 P
0.93 (s a) 455.17 259 P
-0.38 (constant known at compile-time, as many slots are\051 or the register or stack location) 108 247 P
(allocated to hold the value of the slot at run-time.) 108 235 T
1.05 (Our S) 117 220 P
4 F
0.95 (ELF) 143.99 220 P
3 F
1.05 ( compiler also outputs debugging information to support computing) 161.76 220 P
-0.56 (and setting breakpoints. This information takes the form of a bidirectional mapping) 108 208 P
0.18 (between program counter addresses and byte code instructions within a particular) 108 196 P
0.23 (scope. One complexity with this mapping is that it is not one-to-one: several byte) 108 184 P
-0.03 (codes may map to the same program counter address \050as messages get inlined and) 108 172 P
-0.59 (optimized away\051, and several program counter addresses may map to the same byte) 108 160 P
-0.49 (code \050as messages get split and compiled in more than one place\051. T) 108 148 P
-0.49 (o determine the) 400.64 148 P
-0.37 (current state of the program in byte code terms at any program counter address, the) 108 136 P
0.3 (debugger \336rst \336nds the ) 108 124 P
5 F
0.3 (latest) 212.95 124 P
3 F
0.3 ( program counter address in the mapping that is ) 236.76 124 P
5 F
0.3 (less) 451.52 124 P
0.09 (than or equal to) 108 112 P
3 F
0.09 ( the current program counter) 178.78 112 P
0.09 (, and then selects the ) 304.41 112 P
5 F
0.09 (latest) 398.85 112 P
3 F
0.09 ( byte code) 422.66 112 P
1.47 (mapped to that address; this algorithm returns the last byte code that has been) 108 100 P
FMENDPAGE
%%EndPage: "85" 30
%%Page: "86" 30
612 792 0 FMBEGINPAGE
108 630 468 648 R
7 X
0 K
V
7 F
0 X
(86) 108 641.33 T
(CHAMBERS, UNGAR, AND LEE) 332.8 641.33 T
108 89 468 612 R
7 X
V
3 F
0 X
0.88 (started but not completed for any program counter address. The execution stack) 108 265.67 P
-0.37 (displayer uses this mapping information to \336nd the bottommost virtual stack frame) 108 253.67 P
1.05 (for each physical stack frame to display the call stack whenever the program is) 108 241.67 P
(halted.) 108 229.67 T
0.73 (W) 117 214.67 P
0.73 (e have not implemented the breakpointing facilities in our debugger yet; the) 126.49 214.67 P
-0.31 (current \322debugger\323 displays the virtual execution stack and immediately continues) 108 202.67 P
2.68 (execution whenever the ) 108 190.67 P
9 F
5.84 (_DumpSelfStack) 223.12 190.67 P
3 F
2.68 ( primitive is called. However) 307.07 190.67 P
2.68 (, our) 445.18 190.67 P
-0.37 (mapping system is designed to support computing and setting breakpoints in antic-) 108 178.67 P
0.9 (ipation of breakpointing and process control primitives. T) 108 166.67 P
0.9 (o set a breakpoint at a) 367.4 166.67 P
2.41 (particular source-level byte code, the debugger would \336nd all those program) 108 154.67 P
-0.18 (counter addresses associated with the byte code and set breakpoints there. In cases) 108 142.67 P
-0.64 (where several byte codes map to the same program counter address, single stepping) 108 130.67 P
1.68 (from one byte code to the next wouldn\325) 108 118.67 P
1.68 (t actually cause any instructions to be) 293.16 118.67 P
0.19 (executed; the debugger would pretend to execute instructions to preserve the illu-) 108 106.67 P
(sion of byte-coded execution.) 108 94.67 T
108 89 468 612 C
136.11 273 439.89 612 C
136.11 273 439.89 612 R
7 X
0 K
V
273.01 550.54 275.01 554 277.01 550.54 3 L
1 H
0 Z
0 X
N
275.01 527 275.01 554 2 L
7 X
V
2 Z
0 X
N
210.01 489.54 212.01 493 214.01 489.54 3 L
0 Z
3 X
N
212.01 437 212.01 493 2 L
7 X
V
2 Z
3 X
N
196.01 489.54 198.01 493 200.01 489.54 3 L
0 Z
0 X
N
198.01 440 198.01 493 2 L
7 X
V
2 Z
0 X
N
273.01 467.54 275.01 471 277.01 467.54 3 L
0 Z
N
275.01 438 275.01 471 2 L
7 X
V
2 Z
0 X
N
355.01 467.54 357.01 471 359.01 467.54 3 L
0 Z
N
357.01 443 357.01 471 2 L
7 X
V
2 Z
0 X
N
259.01 555.3 263 555 260.75 551.7 3 L
0 Z
N
194.01 522 263.01 555 2 L
7 X
V
2 Z
0 X
N
310.98 551.53 309 555 313 554.98 3 L
0 Z
N
359.01 526 309.01 555 2 L
7 X
V
2 Z
0 X
N
242.01 470 309.01 527 R
7 X
V
0 Z
0 X
N
159.74 309 416.26 400 R
7 X
V
4 F
0 X
1.71 (The debugging information for the ) 159.74 393.33 P
6 F
1.9 (min:) 309.55 393.33 P
4 F
1.71 ( method. Each scope) 328.43 393.33 P
-0.27 (description points to its calling scope description \050black arrows\051;) 159.74 382.33 P
-0.46 (a block scope also points to its lexically-enclosing scope descrip-) 159.74 371.33 P
0.56 (tion \050gray arrows\051. For each slot within a scope, the debugging) 159.74 360.33 P
0.49 (information identi\336es either the slot\325) 159.74 349.33 P
0.49 (s compile-time value or its) 307.71 349.33 P
1.04 (run-time location. For the ) 159.74 338.33 P
6 F
1.16 (min:) 269.11 338.33 P
4 F
1.04 ( example, only the initial ar) 287.99 338.33 P
1.04 (gu-) 402.94 338.33 P
0.45 (ments have run-time locations \050registers r1 and r2 in this case\051;) 159.74 327.33 P
(all other slot contents are known statically at compile-time.) 159.74 316.33 T
182.01 493 227.01 527 R
7 X
V
0 X
N
17 F
(<) 187.01 516 T
19 F
(self) 193.01 507 T
14 F
(:  ) 206.78 507 T
16 F
(r1) 213.45 507 T
14 F
(arg:   ) 193.01 498 T
16 F
(r2) 213.45 498 T
176.01 421 232.01 446 R
7 X
V
0 X
N
17 F
(value) 179.01 435 T
19 F
(block) 186.01 426 T
14 F
(: [. . .]) 206.89 426 T
289.01 550.54 291.01 554 293.01 550.54 3 L
3 X
N
291.01 438 291.01 554 2 L
7 X
V
2 Z
3 X
N
324.01 470 391.01 527 R
7 X
V
0 Z
0 X
N
303.29 550.07 304 554 307.05 551.42 3 L
3 X
N
345.01 439 304.01 554 2 L
7 X
V
2 Z
3 X
N
264.01 554 309.01 588 R
7 X
V
0 Z
0 X
N
17 F
(min:) 269.01 577 T
19 F
(self) 275.01 568 T
14 F
(:  ) 288.78 568 T
16 F
(r1) 295.45 568 T
14 F
(arg:   ) 275.01 559 T
16 F
(r2) 295.45 559 T
328.01 421 387.01 446 R
7 X
V
0 X
N
17 F
(value) 331.01 435 T
19 F
(block) 338.01 426 T
14 F
(: [arg]) 358.89 426 T
17 F
(ifTrue:) 245.03 515 T
19 F
(self) 254.01 495 T
14 F
(:         true) 267.78 495 T
(trueBlk:  [self]) 254.01 486 T
(falseBlk: [arg]) 254.01 476 T
17 F
(False:) 251.03 505 T
(ifTrue:) 327.03 515 T
19 F
(self) 336.01 495 T
14 F
(:       false) 349.78 495 T
(trueBlk: [self]) 336.01 486 T
(falseBlk: [arg]) 336.01 476 T
17 F
(False:) 333.03 505 T
246.01 421 305.01 446 R
7 X
V
0 X
N
(value) 249.01 435 T
19 F
(block) 256.01 426 T
14 F
(: [self]) 276.89 426 T
108 89 468 612 C
0 0 612 792 C
108 294.25 468 294.25 2 L
0.5 H
2 Z
0 X
0 K
N
FMENDPAGE
%%EndPage: "86" 31
14 11 /Symbol FMDEFINEFONT
%%Page: "87" 31
612 792 0 FMBEGINPAGE
108 630 468 648 R
7 X
0 K
V
7 F
0 X
(AN EFFICIENT IMPLEMENTATION OF S) 108 641.33 T
0 F
(ELF) 284.01 641.33 T
7 F
(87) 458.01 641.33 T
108 89 468 612 R
7 X
V
2 F
0 X
(7) 108 603.3 T
(Performance Comparison) 126 603.3 T
3 F
0.07 (S) 117 586.24 P
4 F
0.06 (ELF) 123.11 586.24 P
3 F
0.07 ( is implemented in 33,000 lines of C++ code and 1,000 lines of assembler) 140.88 586.24 P
0.07 (,) 465.25 586.24 P
0.94 (and runs on both the Sun-3 \050a 68020-based machine\051 and the Sun-4 \050a SP) 108 574.24 P
0.94 (ARC-) 441.75 574.24 P
1.21 (based machine\051. W) 108 562.24 P
1.21 (e have written almost 9,000 lines of S) 194.04 562.24 P
4 F
1.1 (ELF) 368.49 562.24 P
3 F
1.21 ( code, including a) 386.27 562.24 P
-0.6 (hierarchy of collection objects, a recursive descent parser for S) 108 550.24 P
4 F
-0.54 (ELF) 379.05 550.24 P
3 F
-0.6 (, and a prototype) 395.94 550.24 P
(graphical user interface.) 108 538.24 T
0.2 (W) 117 523.24 P
0.2 (e compare the performance of our \336rst-generation S) 126.49 523.24 P
4 F
0.19 (ELF) 355.82 523.24 P
3 F
0.2 ( implementation with) 373.59 523.24 P
0.14 (a fast Smalltalk implementation and the standard Sun optimizing C compiler on a) 108 511.24 P
5.54 (Sun-4/260 workstation.) 108 499.24 P
1 F
4.53 (6) 216.69 503.64 P
3 F
5.54 ( The fastest Smalltalk system currently available) 221.18 499.24 P
1.02 (\050excluding graphics performance\051 is the ParcPlace V2.4 ) 108 487.24 P
14 F
1.02 (b) 363.49 487.24 P
3 F
1.02 (2 Smalltalk-80 virtual) 369.52 487.24 P
2.8 (machine, rated at about 4 Dorados) 108 475.24 P
1 F
2.29 (7) 272.74 479.64 P
3 F
2.8 ( [22]; this system includes the Deutsch-) 277.24 475.24 P
0.79 (Schif) 108 463.24 P
0.79 (fman techniques described earlier) 130.99 463.24 P
0.79 (. W) 280.73 463.24 P
0.79 (e compare transliterations from C into) 296.51 463.24 P
1.57 (Smalltalk and S) 108 451.24 P
4 F
1.43 (ELF) 180.73 451.24 P
3 F
1.57 ( of the Stanford integer benchmarks [13] and the Richards) 198.5 451.24 P
-0.5 (operating system simulation benchmark [10], as well as the following small bench-) 108 439.24 P
(marks, adapted from Smalltalk-80 systems [18]:) 108 427.24 T
17 F
(sumToTest = \050 1 sumTo: 10000 \051.) 126 412.91 T
(sumTo: arg = \050) 126 402.41 T
(  | total <- 0 |) 126 391.91 T
(  to: arg Do: [ | :index |) 126 381.41 T
(    total: total + index.) 126 370.91 T
(  ].) 126 360.41 T
(  total \051.) 126 349.91 T
(recurseTest = \050 ) 126 337.41 T
(14 recurse \051.) 221.95 337.41 T
(recurse = \050) 126 326.91 T
(  = 0 ifFalse: [) 126 316.41 T
(    \050- 1\051 recurse. \050- 1\051 recurse.) 126 305.91 T
(  ] \051.) 126 295.41 T
3 F
1.2 (W) 117 281.24 P
1.2 (e also rewrote most of the Stanford integer benchmarks in a more S) 126.49 281.24 P
4 F
1.09 (ELF) 437.41 281.24 P
3 F
1.2 (ish) 455.18 281.24 P
0.29 (programming style, using the \336rst ar) 108 269.24 P
0.29 (gument of a C function as the receiver of the) 269.17 269.24 P
2.39 (corresponding S) 108 257.24 P
4 F
2.17 (ELF) 182.1 257.24 P
3 F
2.39 ( method. Measurements for the rewritten benchmarks are) 199.87 257.24 P
0.72 (presented in columns labeled S) 108 245.24 P
4 F
0.65 (ELF) 247.58 245.24 P
3 F
0.72 (-OO; times in parentheses mark those bench-) 265.35 245.24 P
(marks that were not rewritten.) 108 233.24 T
0.26 (The following table presents the actual running times of the benchmarks on the) 117 218.24 P
-0.59 (speci\336ed platform. All times are in milliseconds of CPU time, except for the Small-) 108 206.24 P
0.28 (talk times, which are in milliseconds of real time; the real time measurements for) 108 194.24 P
0.06 (the S) 108 182.24 P
4 F
0.05 (ELF) 130.34 182.24 P
3 F
0.06 ( system and the compiled C program are practically identical to the CPU) 148.11 182.24 P
1.15 (time numbers, so comparisons in measured performance between the ParcPlace) 108 170.24 P
(Smalltalk system and the other two systems are valid.) 108 158.24 T
108 143 468 148.98 C
108 143 468 148.98 R
7 X
0 K
V
107.48 146.96 251.48 146.96 2 L
V
0.5 H
2 Z
0 X
N
0 0 612 792 C
10 F
0 X
0 K
3.09 (6) 117 140.6 P
1 F
3.97 (Since this paper was originally published, these performance numbers have improved) 120.49 137 P
(significantly, by a factor of two or three. See [7].) 108 127 T
10 F
1.26 (7) 117 118.6 P
1 F
1.62 (A \322Dorado\323 is a measure of the performance of Smalltalk implementations. One Dorado is) 120.49 115 P
0.61 (defined as the performance of an early Smalltalk implementation in microcode on the 70ns Xerox) 108 105 P
(Dorado [9]; until recently it was the fastest available Smalltalk implementation.) 108 95 T
FMENDPAGE
%%EndPage: "87" 32
1 11 /Helvetica-Bold FMDEFINEFONT
%%Page: "88" 32
612 792 0 FMBEGINPAGE
108 630 468 648 R
7 X
0 K
V
7 F
0 X
(88) 108 641.33 T
(CHAMBERS, UNGAR, AND LEE) 332.8 641.33 T
108 89 468 612 R
7 X
V
1 F
0 X
(Raw Running T) 249.1 603.99 T
(imes) 328.86 603.99 T
6 F
(Smalltalk) 202.46 589.92 T
(S) 282.85 589.92 T
13 F
(ELF) 289.52 589.92 T
6 F
(S) 326.97 589.92 T
13 F
(ELF) 333.64 589.92 T
6 F
(-OO) 350.12 589.92 T
(C) 424.78 589.92 T
(\050real ms\051) 203.58 578.92 T
(\050cpu ms\051) 267.13 578.92 T
(\050cpu ms\051) 330.13 578.92 T
(\050cpu ms\051) 393.13 578.92 T
(perm) 135 563.92 T
(1559) 220.77 563.92 T
(660) 289.33 563.92 T
(420) 352.33 563.92 T
(120) 415.33 563.92 T
(towers) 135 552.92 T
(2130) 220.77 552.92 T
(900) 289.33 552.92 T
(560) 352.33 552.92 T
(190) 415.33 552.92 T
(queens) 135 541.92 T
(859) 226.33 541.92 T
(520) 289.33 541.92 T
(470) 352.33 541.92 T
(100) 415.33 541.92 T
(intmm) 135 530.92 T
(1490) 220.77 530.92 T
(970) 289.33 530.92 T
(\050970\051) 345.67 530.92 T
(160) 415.33 530.92 T
(puzzle) 135 519.92 T
(16510) 215.21 519.92 T
(5290) 283.77 519.92 T
(\0505290\051) 340.12 519.92 T
(770) 415.33 519.92 T
(quick) 135 508.92 T
(1239) 220.77 508.92 T
(690) 289.33 508.92 T
(610) 352.33 508.92 T
(1) 416.07 508.92 T
(10) 420.89 508.92 T
(bubble) 135 497.92 T
(2970) 220.77 497.92 T
(1660) 283.77 497.92 T
(1230) 346.77 497.92 T
(170) 415.33 497.92 T
(tree) 135 486.92 T
(1760) 220.77 486.92 T
(1750) 283.77 486.92 T
(1480) 346.77 486.92 T
(820) 415.33 486.92 T
(richards) 135 471.92 T
(7740) 220.77 471.92 T
(2760) 283.77 471.92 T
(\0502760\051) 340.12 471.92 T
(730) 415.33 471.92 T
(sumT) 135 456.92 T
(oT) 158.88 456.92 T
(est) 169.43 456.92 T
(25) 231.89 456.92 T
(18) 294.89 456.92 T
(\05018\051) 351.23 456.92 T
(4) 426.44 456.92 T
(recurseT) 135 441.92 T
(est) 173.32 441.92 T
(169) 226.33 441.92 T
(52) 294.89 441.92 T
(\05052\051) 351.23 441.92 T
(32) 420.89 441.92 T
3 F
-0.46 (The entries in the following table are the ratios of the running times of the bench-) 117 415.25 P
0.53 (marks for the given pair of systems. From our point of view) 108 403.25 P
0.53 (, bigger numbers are) 376.11 403.25 P
1.02 (better in the \336rst two columns, while smaller numbers are better in the last two) 108 391.25 P
1.31 (columns. The most meaningful rows of the table are probably the rows for the) 108 379.25 P
0.76 (median of the Stanford integer benchmarks and the row for the Richards bench-) 108 367.25 P
(mark.) 108 355.25 T
1 F
(Relative Performance of S) 223.98 337.58 T
15 F
(ELF) 360.14 337.58 T
6 F
(Smalltalk/) 184.01 323.5 T
(Smalltalk/) 236.68 323.5 T
(Smalltalk/) 289.36 323.5 T
(S) 353.38 323.5 T
13 F
(ELF) 360.05 323.5 T
6 F
(/) 376.53 323.5 T
(S) 398.6 323.5 T
13 F
(ELF) 405.27 323.5 T
6 F
(-OO/) 421.75 323.5 T
(S) 194.1 313.5 T
13 F
(ELF) 200.76 313.5 T
6 F
(S) 237.33 313.5 T
13 F
(ELF) 243.99 313.5 T
6 F
(-OO) 260.48 313.5 T
(C) 307.4 313.5 T
(C) 362.73 313.5 T
(C) 417.4 313.5 T
(perm) 135 299.5 T
(2.4) 198.66 299.5 T
(3.7) 252.66 299.5 T
(13.0) 301.11 299.5 T
(5.5) 360.67 299.5 T
(3.5) 414.67 299.5 T
(towers) 135 288.5 T
(2.4) 198.66 288.5 T
(3.8) 252.66 288.5 T
(1) 301.85 288.5 T
(1.2) 306.67 288.5 T
(4.7) 360.67 288.5 T
(2.9) 414.67 288.5 T
(queens) 135 277.5 T
(1.7) 198.66 277.5 T
(1.8) 252.66 277.5 T
(8.6) 306.67 277.5 T
(5.2) 360.67 277.5 T
(4.7) 414.67 277.5 T
(intmm) 135 266.5 T
(1.5) 198.66 266.5 T
(\0501.5\051) 249.34 266.5 T
(9.3) 306.67 266.5 T
(6.1) 360.67 266.5 T
(\0506.1\051) 411.34 266.5 T
(puzzle) 135 255.5 T
(3.1) 198.66 255.5 T
(\0503.1\051) 249.34 255.5 T
(21.4) 301.11 255.5 T
(6.9) 360.67 255.5 T
(\0506.9\051) 411.34 255.5 T
(quick) 135 244.5 T
(1.8) 198.66 244.5 T
(2.0) 252.66 244.5 T
(1) 301.85 244.5 T
(1.3) 306.67 244.5 T
(6.3) 360.67 244.5 T
(5.5) 414.67 244.5 T
(bubble) 135 233.5 T
(1.8) 198.66 233.5 T
(2.4) 252.66 233.5 T
(17.5) 301.11 233.5 T
(9.8) 360.67 233.5 T
(7.2) 414.67 233.5 T
(tree) 135 222.5 T
(1.0) 198.66 222.5 T
(1.2) 252.66 222.5 T
(2.1) 306.67 222.5 T
(2.1) 360.67 222.5 T
(1.8) 414.67 222.5 T
15 F
(min) 135 211.5 T
(1.0) 198.66 211.5 T
(1.2) 252.66 211.5 T
(2.1) 306.67 211.5 T
(2.1) 360.67 211.5 T
(1.8) 414.67 211.5 T
(median) 135 200.5 T
(1.8) 198.66 200.5 T
(2.2) 252.66 200.5 T
(1) 301.66 200.5 T
(1.2) 306.67 200.5 T
(5.8) 360.67 200.5 T
(5.1) 414.67 200.5 T
(max) 135 189.5 T
(3.1) 198.66 189.5 T
(3.7) 252.66 189.5 T
(21.4) 301.11 189.5 T
(9.8) 360.67 189.5 T
(7.2) 414.67 189.5 T
6 F
(richards) 135 174.5 T
(2.8) 198.66 174.5 T
(\0502.8\051) 249.34 174.5 T
(10.6) 301.11 174.5 T
(3.8) 360.67 174.5 T
(\0503.8\051) 411.34 174.5 T
(sumT) 135 159.5 T
(oT) 158.88 159.5 T
(est) 169.43 159.5 T
(1.4) 198.66 159.5 T
(\0501.4\051) 249.34 159.5 T
(6.2) 306.67 159.5 T
(4.5) 360.67 159.5 T
(\0504.5\051) 411.34 159.5 T
(recurseT) 135 144.5 T
(est) 173.32 144.5 T
(3.2) 198.66 144.5 T
(\0503.2\051) 249.34 144.5 T
(5.3) 306.67 144.5 T
(1.6) 360.67 144.5 T
(\0501.6\051) 411.34 144.5 T
3 F
0.69 (Our S) 117 117.84 P
4 F
0.62 (ELF) 143.62 117.84 P
3 F
0.69 ( implementation outperforms the Smalltalk implementation on every) 161.4 117.84 P
0.98 (benchmark; in many cases S) 108 105.84 P
4 F
0.89 (ELF) 237 105.84 P
3 F
0.98 ( runs more than twice as fast as Smalltalk. Not) 254.77 105.84 P
0.3 (surprisingly) 108 93.84 P
0.3 (, an optimizing C compiler does better than the S) 159.78 93.84 P
4 F
0.27 (ELF) 377.91 93.84 P
3 F
0.3 ( compiler) 395.68 93.84 P
0.3 (. Some) 437.18 93.84 P
FMENDPAGE
%%EndPage: "88" 33
%%Page: "89" 33
612 792 0 FMBEGINPAGE
108 630 468 648 R
7 X
0 K
V
7 F
0 X
(AN EFFICIENT IMPLEMENTATION OF S) 108 641.33 T
0 F
(ELF) 284.01 641.33 T
7 F
(89) 458.01 641.33 T
108 89 468 612 R
7 X
V
3 F
0 X
0.25 (of the dif) 108 604.67 P
0.25 (ference in performance results from signi\336cantly poorer implementation) 148.59 604.67 P
0.63 (in the S) 108 592.67 P
4 F
0.57 (ELF) 142.83 592.67 P
3 F
0.63 ( compiler of standard compiler techniques such as register allocation) 160.6 592.67 P
0.04 (and peephole optimization. Some of the dif) 108 580.67 P
0.04 (ference may be attributed to the robust) 298.14 580.67 P
-0.07 (semantics of primitive operations in S) 108 568.67 P
4 F
-0.07 (ELF) 274.55 568.67 P
3 F
-0.07 (: arithmetic operations always check for) 292.33 568.67 P
1.64 (over\337ow) 108 556.67 P
1.64 (, array accesses always check for indices out of bounds, method calls) 146.34 556.67 P
0.35 (always check for stack over\337ow) 108 544.67 P
0.35 (. The rest of the dif) 250.25 544.67 P
0.35 (ference is probably caused by) 336.02 544.67 P
-0.57 (the lack of type information, especially for ar) 108 532.67 P
-0.57 (guments and assignable data slots. W) 302.71 532.67 P
-0.57 (e) 463.12 532.67 P
0.59 (are remedying these de\336ciencies to a lar) 108 520.67 P
0.59 (ge extent in the second-generation S) 287.69 520.67 P
4 F
0.54 (ELF) 450.23 520.67 P
3 F
(system described in the next section.) 108 508.67 T
1.66 (The previous tables show that the performance of object-oriented systems is) 117 493.67 P
0.28 (improving dramatically) 108 481.67 P
0.28 (. As a new metric for comparing the performance of these) 211.02 481.67 P
-0.03 (systems, we propose the ) 108 469.67 P
5 F
-0.03 (millions of messages per second \050MiMS\051) 217.42 469.67 P
3 F
-0.03 ( measure, analo-) 395.76 469.67 P
-0.64 (gous to the millions of instructions per second \050MIPS\051 measure for processors. This) 108 457.67 P
2.68 (number measures the performance of an object-oriented system in executing) 108 445.67 P
-0.01 (messages. T) 108 433.67 P
-0.01 (o compute the MiMS rating of a system for a speci\336c benchmark on a) 160.92 433.67 P
-0.28 (particular hardware platform, divide the number of messages the benchmark sends) 108 421.67 P
1.31 (by its total running time. W) 108 409.67 P
1.31 (e de\336ne message sends as those invocations whose) 235.15 409.67 P
1.66 (semantics include a dispatch; for S) 108 397.67 P
4 F
1.51 (ELF) 269.2 397.67 P
3 F
1.66 (, this includes references to slots in the) 286.09 397.67 P
1.01 (receiver \050\322instance variable\323 accesses\051, since the same reference could invoke a) 108 385.67 P
0.02 (method, but excludes references to slots local to a method invocation \050\322local vari-) 108 373.67 P
0.99 (able\323 accesses\051, since these could never do anything other than access data. W) 108 361.67 P
0.99 (e) 463.12 361.67 P
0.74 (computed the MiMS rating of our \336rst-generation S) 108 349.67 P
4 F
0.67 (ELF) 340.49 349.67 P
3 F
0.74 ( system for the Richards) 358.26 349.67 P
3 (benchmark on the SP) 108 337.67 P
3 (ARC-based Sun-4/260 to be 3.3 MiMS, or a message) 209.66 337.67 P
(executed every 300ns [16].) 108 325.67 T
2.45 (The ) 117 310.67 P
5 F
2.45 (ef\336ciency) 139.28 310.67 P
3 F
2.45 ( of an object-oriented system is inversely proportional to the) 180.77 310.67 P
-0.64 (number of instructions executed per message sent. The cycle time on the Sun-4/260) 108 298.67 P
0.34 (is 60ns [21], giving our S) 108 286.67 P
4 F
0.31 (ELF) 221.38 286.67 P
3 F
0.34 ( system a cost per message of about 5 cycles. Since) 239.15 286.67 P
1.43 (the SP) 108 274.67 P
1.43 (ARC has been clocked at 1.6 cycles per instruction [21] \050accounting for) 136.81 274.67 P
-0.58 (cache misses and multicycle instructions\051, this would give our S) 108 262.67 P
4 F
-0.53 (ELF) 384.74 262.67 P
3 F
-0.58 ( system an ef) 402.51 262.67 P
-0.58 (\336-) 458.23 262.67 P
0.43 (ciency rating of around 3 instructions per message sent. W) 108 250.67 P
0.43 (e are not aware of any) 368.53 250.67 P
4.87 (other implementations of dynamically-typed object-oriented languages that) 108 238.67 P
(approach this level of ef) 108 226.67 T
(\336ciency) 213.97 226.67 T
(.) 248.04 226.67 T
1.48 (Other researchers have attempted to speed Smalltalk systems by adding type) 117 211.67 P
1.86 (declarations to Smalltalk programs. Atkinson\325) 108 199.67 P
1.86 (s Hurricane compiler compiles a) 317.77 199.67 P
-0.22 (subset of Smalltalk annotated with type declarations [1]. He reports a performance) 108 187.67 P
2.74 (improvement of a factor of 2 for his Hurricane compiler over the Deutsch-) 108 175.67 P
2.81 (Schif) 108 163.67 P
2.81 (fman system on a 68020-based Sun-3; our initial S) 130.99 163.67 P
4 F
2.56 (ELF) 376.26 163.67 P
3 F
2.81 ( system already) 394.03 163.67 P
0.17 (achieves the same performance improvement over the Deutsch-Schif) 108 151.67 P
0.17 (fman system) 411.98 151.67 P
0.28 (without type declarations. Johnson\325) 108 139.67 P
0.28 (s TS T) 264.47 139.67 P
0.28 (yped Smalltalk system type-checks and) 293.56 139.67 P
0.94 (compiles Smalltalk-80 programs fully annotated with type declarations [14]. He) 108 127.67 P
1.85 (reports a performance improvement of a factor of between 5 and 10 over the) 108 115.67 P
-0.19 (T) 108 103.67 P
-0.19 (ektronix Smalltalk-80 interpreter on a 68020-based T) 113.94 103.67 P
-0.19 (ektronix 4405. For a bench-) 346.39 103.67 P
FMENDPAGE
%%EndPage: "89" 34
%%Page: "90" 34
612 792 0 FMBEGINPAGE
108 630 468 648 R
7 X
0 K
V
7 F
0 X
(90) 108 641.33 T
(CHAMBERS, UNGAR, AND LEE) 332.8 641.33 T
108 89 468 612 R
7 X
V
3 F
0 X
-0.19 (mark almost identical to our ) 108 604.67 P
9 F
-0.43 (sumToTest) 233.66 604.67 P
3 F
-0.19 ( benchmark, he reports an execution time) 287.63 604.67 P
1.04 (of 62ms, which we executed in 18ms on a machine 3 to 4 times faster than his) 108 592.67 P
3.66 (machine. This makes his system\325) 108 580.67 P
3.66 (s performance roughly comparable to our) 267.58 580.67 P
1.06 (system\325) 108 568.67 P
1.06 (s performance, even though his system relies on type declarations while) 141.57 568.67 P
-0.15 (ours does not. These results suggest that our compilation techniques do a good job) 108 556.67 P
2.08 (of extracting as much type information as is available to these other systems) 108 544.67 P
(through programmer) 108 532.67 T
(-supplied type declarations.) 199.01 532.67 T
2 F
(8) 108 503.3 T
(Futur) 126 503.3 T
(e W) 158.23 503.3 T
(ork) 179.51 503.3 T
3 F
-0.23 (S) 117 484.24 P
4 F
-0.21 (ELF) 123.11 484.24 P
3 F
-0.23 ( has not reached its \336nal state. Although we have established the feasibility) 140.88 484.24 P
0.04 (and rewards of the implementation techniques described in this paper) 108 472.24 P
0.04 (, much work) 412.7 472.24 P
(remains.) 108 460.24 T
8 F
(8.1) 108 440.21 T
(The Second-Generation S) 135 440.21 T
12 F
(ELF) 255.24 440.21 T
8 F
( System) 274.68 440.21 T
3 F
-0.02 (W) 117 423.57 P
-0.02 (e are in the process of reimplementing our entire S) 126.49 423.57 P
4 F
-0.02 (ELF) 348.73 423.57 P
3 F
-0.02 ( system to clean up our) 366.5 423.57 P
0.99 (code, simplify our design, and include better compilation algorithms. As of this) 108 411.57 P
0.66 (writing \050July 1989\051, we have completely rewritten the object storage system and) 108 399.57 P
0.14 (uni\336ed the run-time/compile-time message lookup system. W) 108 387.57 P
0.14 (e have implemented) 379.24 387.57 P
1.7 (the core of the second-generation compiler) 108 375.57 P
1.7 (, and it now compiles and executes) 304.31 375.57 P
(about half of our S) 108 363.57 T
4 F
(ELF) 190.39 363.57 T
3 F
( code.) 208.16 363.57 T
0.62 (The new compiler performs type \337ow analysis to determine the types of many) 117 348.57 P
-0.06 (local slots at compile-time. It also includes a signi\336cantly more powerful message) 108 336.57 P
0.73 (splitting system. The initial message splitter described in this paper only splits a) 108 324.57 P
-0.35 (message based on the type of the result of the previous message; the second-gener-) 108 312.57 P
1.09 (ation message splitting system can use any type information constructed during) 108 300.57 P
1.06 (type \337ow analysis, especially the types of local slots. The message splitter may) 108 288.57 P
0.83 (elect to split messages even when the message is not immediately after a mer) 108 276.57 P
0.83 (ge) 457.63 276.57 P
1.15 (point, splitting all messages that intervene between the mer) 108 264.57 P
1.15 (ge that lost the type) 377.33 264.57 P
(information and the message that needs the type information.) 108 252.57 T
1.43 (Our goal for the combined type analyzer and extended message splitter is to) 117 237.57 P
0.15 (allow the compiler to split of) 108 225.57 P
0.15 (f entire sections of the control \337ow graph, especially) 235.81 225.57 P
0.35 (loop bodies, that manipulate the most common data types. Along these common-) 108 213.57 P
0.35 (case sections, the types of most variables will be known at compile-time, leading) 108 201.57 P
0.99 (to maximally-inlined code with few run-time type checks; in the other sections,) 108 189.57 P
-0.16 (less type information is available to the compiler) 108 177.57 P
-0.16 (, and more full message sends are) 320.97 177.57 P
0.3 (generated. Under normal conditions the optimized code will be executed, and the) 108 165.57 P
0.23 (method will run fast, possibly just as fast as for a C program. However) 108 153.57 P
0.23 (, in excep-) 421.48 153.57 P
-0.36 (tional situations, such as when an over\337ow actually occurs, the \337ow of control will) 108 141.57 P
2.03 (transfer to a less optimized section of the method that preserves the message) 108 129.57 P
(passing semantics.) 108 117.57 T
FMENDPAGE
%%EndPage: "90" 35
%%Page: "91" 35
612 792 0 FMBEGINPAGE
108 630 468 648 R
7 X
0 K
V
7 F
0 X
(AN EFFICIENT IMPLEMENTATION OF S) 108 641.33 T
0 F
(ELF) 284.01 641.33 T
7 F
(91) 458.01 641.33 T
108 89 468 612 R
7 X
V
3 F
0 X
2.57 (Our second-generation compiler also performs data \337ow analysis, common) 117 604.67 P
-0.12 (subexpression elimination, code motion, global register allocation, and instruction) 108 592.67 P
0.75 (scheduling. W) 108 580.67 P
0.75 (e hope that the addition of these optimizations will allow our new) 171.34 580.67 P
(S) 108 568.67 T
4 F
(ELF) 114.11 568.67 T
3 F
( compiler to compete with high-quality production optimizing compilers.) 131.88 568.67 T
8 F
(8.2) 108 544.64 T
(Open Issues) 135 544.64 T
3 F
-0.31 (Method ar) 117 526 P
-0.31 (guments are one of the lar) 161.95 526 P
-0.31 (gest sources of \322unknown\323 type information) 274.6 526 P
2.52 (in the current compiler) 108 514 P
2.52 (. W) 215.33 514 P
2.52 (e want to extend our second-generation system to) 232.83 514 P
-0.27 (customize methods by the types of their ar) 108 502 P
-0.27 (guments in addition to the receiver type.) 292.34 502 P
-0.57 (This extension would provide the compiler with static type information about ar) 108 490 P
-0.57 (gu-) 453.36 490 P
0.19 (ments so it could generate faster code. These bene\336ts have to be balanced against) 108 478 P
-0.01 (the costs of verifying the types of ar) 108 466 P
-0.01 (guments in the prologue of the method at run-) 266.08 466 P
(time.) 108 454 T
-0.25 (The compile-time lookup strategy works nicely as long as all the parents that get) 117 439 P
0.05 (searched are constant parents; if any are assignable, then the compile-time lookup) 108 427 P
0.58 (fails, and the message cannot be inlined. Our second generation system provides) 108 415 P
1.88 (limited support for dynamically-inherited methods by adding the types of any) 108 403 P
0.24 (assignable parents traversed in the run-time lookup to the customization informa-) 108 391 P
1.77 (tion about the method; the method prologue tests the values of the assignable) 108 379 P
-0.05 (parents in addition to the type of the receiver) 108 367 P
-0.05 (. W) 304.1 367 P
-0.05 (e plan to investigate techniques to) 319.03 367 P
(optimize dynamically-inherited methods.) 108 355 T
2.09 (The message inliner needs to make better decisions about when to inline a) 117 340 P
0.79 (method, and when not to. The inliner should use information about the call site,) 108 328 P
-0.08 (such as whether it\325) 108 316 P
-0.08 (s in a loop or in a failure block, to help decide whether to inline) 189.85 316 P
0.25 (the send, without wasting too much extra compile time and compiled code space.) 108 304 P
1.29 (It should also do a better job of deciding if a method is short enough to inline) 108 292 P
-0.22 (reasonably; counting the byte codes with a \336xed cut-of) 108 280 P
-0.22 (f value as it does now is not) 347.14 280 P
0.43 (a very good algorithm. Finally) 108 268 P
0.43 (, our implementation of type prediction hard-wires) 242.98 268 P
0.47 (both the message names and the predicted type; a more dynamic implementation) 108 256 P
-0.59 (that used dynamic pro\336le information or analysis of the S) 108 244 P
4 F
-0.54 (ELF) 355.63 244 P
3 F
-0.59 ( inheritance hierarchy) 373.4 244 P
(might produce better) 108 232 T
(, more adapting results.) 199.1 232 T
0.14 (The current implementation of the compiler) 117 217 P
0.14 (, though speedy by traditional batch) 309.82 217 P
0.11 (optimizing compiler standards, is not yet fast enough for our interactive program-) 108 205 P
-0.67 (ming environment. The compiler takes over seven seconds to compile and optimize) 108 193 P
-0.44 (the Stanford integer benchmarks \050almost 900 lines of S) 108 181 P
4 F
-0.4 (ELF) 346.74 181 P
3 F
-0.44 ( code\051, and almost three) 364.51 181 P
-0.06 (seconds to compile and optimize the Richards benchmark \050over 400 lines of S) 108 169 P
4 F
-0.06 (ELF) 450.23 169 P
3 F
2.24 (code\051. W) 108 157 P
2.24 (e plan to experiment with strategies in which the compiler executes) 149.63 157 P
1.75 (quickly with little optimization whenever the user is waiting for the compiler) 108 145 P
1.75 (,) 465.25 145 P
0.42 (queuing up background jobs to recompile unoptimized methods with full optimi-) 108 133 P
(zation later) 108 121 T
(.) 156.52 121 T
-0.26 (W) 117 106 P
-0.26 (ork remains in making sure that our techniques are practical for lar) 126.49 106 P
-0.26 (ger systems) 416.68 106 P
-0.17 (than we have tested. T) 108 94 P
-0.17 (o fully understand the contributions of our work, we need to) 205.11 94 P
FMENDPAGE
%%EndPage: "91" 36
%%Page: "92" 36
612 792 0 FMBEGINPAGE
108 630 468 648 R
7 X
0 K
V
7 F
0 X
(92) 108 641.33 T
(CHAMBERS, UNGAR, AND LEE) 332.8 641.33 T
108 89 468 612 R
7 X
V
3 F
0 X
0.25 (analyze the relative performance gains and the associated space and time costs of) 108 604.67 P
0.39 (our techniques. This analysis will be performed as part of the \336rst author) 108 592.67 P
0.39 (\325) 432.52 592.67 P
0.39 (s forth-) 435.58 592.67 P
(coming dissertation.) 108 580.67 T
2 F
(9) 108 547.3 T
(Conclusions) 126 547.3 T
3 F
-0.63 (Many researchers have attempted to boost the performance of dynamically-typed) 117 524.24 P
1.25 (object-oriented languages. The designers of Smalltalk-80 hard-wired the de\336ni-) 108 512.24 P
-0.44 (tions of user) 108 500.24 P
-0.44 (-level arithmetic and control methods into the compiler) 161.21 500.24 P
-0.44 (, preventing the) 400.24 500.24 P
-0.4 (users from changing or overriding them. Other researchers added type declarations) 108 488.24 P
2.89 (to Smalltalk, thereby hindering reuse and modi\336cation of code. W) 108 476.24 P
2.89 (e devised) 423.92 476.24 P
5 F
3.97 (dynamic customized compilation) 108 464.24 P
3 F
3.97 (, ) 259.97 464.24 P
5 F
3.97 (static type pr) 269.43 464.24 P
3.97 (ediction) 334.33 464.24 P
3 F
3.97 (, ) 369.73 464.24 P
5 F
3.97 (type \337ow analysis) 379.19 464.24 P
3 F
3.97 (,) 465.25 464.24 P
5 F
-0.52 (message splitting) 108 452.24 P
3 F
-0.52 (, and ) 183.47 452.24 P
5 F
-0.52 (message inlining) 206.52 452.24 P
3 F
-0.52 ( to automatically extract and preserve static) 280.15 452.24 P
0.83 (type information. Our measurements suggest that our system runs just as fast as) 108 440.24 P
0.86 (Smalltalk systems with type declarations and at least twice as fast as those with) 108 428.24 P
-0.42 (hard-wired methods. Researchers seeking to improve performance should improve) 108 416.24 P
(their compilers instead of compromising their languages.) 108 404.24 T
-0.37 (S) 117 389.24 P
4 F
-0.34 (ELF) 123.11 389.24 P
3 F
-0.37 (\325) 140.88 389.24 P
-0.37 (s novel features do not cost the user either execution time or storage space.) 143.93 389.24 P
0.4 (Our virtual machine supports the prototype object model just as space- and time-) 108 377.24 P
3.37 (ef) 108 365.24 P
3.37 (\336ciently as similar class-based systems; maps act as implementation-level) 116.34 365.24 P
0.65 (classes and thus reclaim the ef) 108 353.24 P
0.65 (\336ciency of classes for the implementation without) 244.39 353.24 P
-0.65 (in\337icting class-based semantics on the S) 108 341.24 P
4 F
-0.6 (ELF) 282.03 341.24 P
3 F
-0.65 ( user) 299.8 341.24 P
-0.65 (. S) 319.59 341.24 P
4 F
-0.6 (ELF) 330.54 341.24 P
3 F
-0.65 (\325) 348.31 341.24 P
-0.65 (s use of messages to access) 351.36 341.24 P
-0.63 (variables has absolutely no ef) 108 329.24 P
-0.63 (fect on the \336nal performance of S) 235.27 329.24 P
4 F
-0.57 (ELF) 379.17 329.24 P
3 F
-0.63 ( programs, since) 396.94 329.24 P
1.55 (these message sends are the \336rst to get inlined away) 108 317.24 P
1.55 (. Once an implementation) 349.82 317.24 P
0.27 (reaches this level of sophistication and performance, the information provided by) 108 305.24 P
2.34 (classes and explicit variables becomes redundant and unnecessary) 108 293.24 P
2.34 (. Prototype-) 413.79 293.24 P
(based languages can run just as fast as class-based languages.) 108 281.24 T
2.15 (Our implementation introduces new techniques to support the programming) 117 266.24 P
0.58 (environment. The segregation of object references from byte arrays speeds scav-) 108 254.24 P
1.31 (enging and scanning operations. Dependency lists reduce the response time for) 108 242.24 P
0.64 (programming changes. Detailed debugging information maps the execution state) 108 230.24 P
-0.54 (into the user) 108 218.24 P
-0.54 (\325) 161.64 218.24 P
-0.54 (s source-level execution model, transparently \322undoing\323 the ef) 164.69 218.24 P
-0.54 (fects of) 435.9 218.24 P
(method inlining and other optimizations.) 108 206.24 T
-0.36 (Our techniques are not restricted to S) 117 191.24 P
4 F
-0.33 (ELF) 278.39 191.24 P
3 F
-0.36 (; they apply to other dynamically-typed) 296.16 191.24 P
0.69 (object-oriented languages like Smalltalk, Flavors, and CLOS. Many of our tech-) 108 179.24 P
1.72 (niques could even be applied to statically-typed object-oriented languages like) 108 167.24 P
-0.11 (C++ and T) 108 155.24 P
-0.11 (rellis/Owl. For example, customization and automatic inlining could be) 155.18 155.24 P
1.48 (used to eliminate many C++ virtual function calls, encouraging broader use of) 108 143.24 P
-0.18 (object-oriented features and programming styles by reducing their cost. Compiler) 108 131.24 P
-0.18 (-) 464.34 131.24 P
0.44 (generated debugging information could be used by the C++ debugger to hide the) 108 119.24 P
1.2 (inlining from the user) 108 107.24 P
1.2 (, just as our compiler generates debugging information to) 206.67 107.24 P
(reconstruct the S) 108 95.24 T
4 F
(ELF) 181.84 95.24 T
3 F
( virtual call stack.) 199.61 95.24 T
FMENDPAGE
%%EndPage: "92" 37
%%Page: "93" 37
612 792 0 FMBEGINPAGE
108 630 468 648 R
7 X
0 K
V
7 F
0 X
(AN EFFICIENT IMPLEMENTATION OF S) 108 641.33 T
0 F
(ELF) 284.01 641.33 T
7 F
(93) 458.01 641.33 T
108 89 468 612 R
7 X
V
3 F
0 X
1.76 (S) 117 604.67 P
4 F
1.6 (ELF) 123.11 604.67 P
3 F
1.76 ( is practical: our implementation of S) 140.88 604.67 P
4 F
1.6 (ELF) 314.98 604.67 P
3 F
1.76 ( is twice as fast as any other) 332.75 604.67 P
0.87 (dynamically-typed purely object-oriented language documented in the literature.) 108 592.67 P
-0.13 (The S) 108 580.67 P
4 F
-0.12 (ELF) 133.8 580.67 P
3 F
-0.13 ( compiler achieves this level of ef) 151.58 580.67 P
-0.13 (\336ciency by combining traditional opti-) 298.86 580.67 P
-0.01 (mizing compiler technology like procedure inlining and global register allocation,) 108 568.67 P
0.6 (specialized techniques developed for high-speed Smalltalk systems like dynamic) 108 556.67 P
1.32 (translation and inline caching, and new techniques like customization, message) 108 544.67 P
0.31 (splitting, and type prediction to bridge the gap between them. The syner) 108 532.67 P
0.31 (gy of old) 427.7 532.67 P
(and new results in good performance.) 108 520.67 T
2 F
(10) 108 487.3 T
(Acknowledgments) 126 487.3 T
3 F
0.58 (W) 117 464.24 P
0.58 (e owe much to Randy Smith, one of the original designers of S) 126.49 464.24 P
4 F
0.53 (ELF) 409.64 464.24 P
3 F
0.58 (. W) 426.53 464.24 P
0.58 (e also) 442.09 464.24 P
0.96 (would like to thank Peter Deutsch for many instructive discussions and seminal) 108 452.24 P
-0.63 (ideas for the design and implementation of S) 108 440.24 P
4 F
-0.57 (ELF) 300.41 440.24 P
3 F
-0.63 (. Bay-W) 317.3 440.24 P
-0.63 (ei Chang implemented our) 353.02 440.24 P
0.19 (graphical S) 108 428.24 P
4 F
0.17 (ELF) 157.93 428.24 P
3 F
0.19 ( object browser and contributed to discussions on the future of the) 175.7 428.24 P
(S) 108 416.24 T
4 F
(ELF) 114.11 416.24 T
3 F
( language and implementation.) 131.88 416.24 T
2 F
(Refer) 108 382.91 T
(ences) 138.76 382.91 T
3 F
(1.) 115 358.24 T
-0.03 (Atkinson, R. G. Hurricane: An Optimizing Compiler for Smalltalk. In ) 132 358.24 P
5 F
-0.03 (OOP-) 441.76 358.24 P
1.55 (SLA \32586 Confer) 132 346.24 P
1.55 (ence Pr) 203.67 346.24 P
1.55 (oceedings) 238.67 346.24 P
3 F
1.55 (. Published as ) 282.61 346.24 P
5 F
1.55 (SIGPLAN Notices) 350.74 346.24 P
3 F
1.55 (, 21, 11) 431.94 346.24 P
(\0501986\051 151-158.) 132 334.24 T
(2.) 115 316.24 T
0.18 (Ballard, M. B., Maier) 132 316.24 P
0.18 (, D., and W) 227 316.24 P
0.18 (irfs-Brock, A. QUICKT) 277.75 316.24 P
0.18 (ALK: A Smalltalk-) 382.8 316.24 P
-0.22 (80 Dialect for De\336ning Primitive Methods. In ) 132 304.24 P
5 F
-0.22 (OOPSLA \32586 Confer) 334.91 304.24 P
-0.22 (ence Pr) 425.61 304.24 P
-0.22 (o-) 458.85 304.24 P
(ceedings) 132 292.24 T
3 F
(. Published as ) 170.44 292.24 T
5 F
(SIGPLAN Notices) 233.92 292.24 T
3 F
(, 21, 11 \0501986\051 140-150.) 313.57 292.24 T
(3.) 115 274.24 T
0.32 (Bobrow) 132 274.24 P
0.32 (, D. G.,) 166.68 274.24 P
0.32 ( DeMichiel, L. G.) 199.66 274.24 P
0.32 (, Gabriel, R. P) 278.73 274.24 P
0.32 (., Keene, S. E., Kiczales, G.,) 341.32 274.24 P
0.76 (and Moon, D. A. Common Lisp Object System Speci\336cation. Published as) 132 262.24 P
5 F
(SIGPLAN Notices) 132 250.24 T
3 F
(, 23, 9 \050) 211.65 250.24 T
(1988\051.) 245.52 250.24 T
(4.) 115 232.24 T
0.28 (Borning, A. H. Classes V) 132 232.24 P
0.28 (ersus Prototypes in Object-Oriented Languages. In) 243.88 232.24 P
5 F
0.7 (Pr) 132 220.24 P
0.7 (oceedings of the ACM/IEEE Fall Joint Computer Confer) 142.58 220.24 P
0.7 (ence) 397.04 220.24 P
3 F
0.7 ( \0501986\051 36-) 417.16 220.24 P
(40.) 132 208.24 T
(5.) 115 190.24 T
-0.46 (Borning, A. H., and Ingalls, D. H. H. A type declaration and inference system) 132 190.24 P
2.1 (for Smalltalk. In ) 132 178.24 P
5 F
2.1 (Confer) 213.36 178.24 P
2.1 (ence Recor) 243.48 178.24 P
2.1 (d of the Ninth Annual Symposium on) 294.28 178.24 P
(Foundations of Computer Science) 132 166.24 T
3 F
( \0501982\051 133-139.) 281.83 166.24 T
(6.) 115 148.24 T
0 (Chambers, C., and Ungar) 132 148.24 P
0 (, D. Customization: Optimizing Compiler T) 243.24 148.24 P
0 (echnol-) 435.05 148.24 P
2.37 (ogy for S) 132 136.24 P
4 F
2.16 (ELF) 177.63 136.24 P
3 F
2.37 (, a Dynamically-T) 194.52 136.24 P
2.37 (yped Object-Oriented Programming Lan-) 278.74 136.24 P
1.73 (guage. In ) 132 124.24 P
5 F
1.73 (Pr) 179.1 124.24 P
1.73 (oceedings of the SIGPLAN \32589 Confer) 189.67 124.24 P
1.73 (ence on Pr) 366.69 124.24 P
1.73 (ogramming) 417.34 124.24 P
-0.37 (Language Design and Implementation) 132 112.24 P
3 F
-0.37 (. Published as ) 299.64 112.24 P
5 F
-0.37 (SIGPLAN Notices) 362 112.24 P
3 F
-0.37 (, 24, 7) 441.28 112.24 P
(\0501) 132 100.24 T
(989\051 146-160.) 141.15 100.24 T
FMENDPAGE
%%EndPage: "93" 38
%%Page: "94" 38
612 792 0 FMBEGINPAGE
108 630 468 648 R
7 X
0 K
V
7 F
0 X
(94) 108 641.33 T
(CHAMBERS, UNGAR, AND LEE) 332.8 641.33 T
108 89 468 612 R
7 X
V
3 F
0 X
(7.) 115 604.67 T
-0.06 (Chambers, C., and Ungar) 132 604.67 P
-0.06 (, D. Iterative T) 243.07 604.67 P
-0.06 (ype Analysis and Extended Message) 307.12 604.67 P
-0.62 (Splitting: Optimizing Dynamically-T) 132 592.67 P
-0.62 (yped Object-Oriented Programs. In) 293.58 592.67 P
11 F
-0.45 ( ) 446.72 592.67 P
5 F
-0.62 (Pr) 448.27 592.67 P
-0.62 (o-) 458.85 592.67 P
0.3 (ceedings of the ACM SIGPLAN \32590 Confer) 132 580.67 P
0.3 (ence on Pr) 322.57 580.67 P
0.3 (ogramming Language) 370.35 580.67 P
1.26 (Design and Implementation) 132 568.67 P
3 F
1.26 (. Published as ) 256.57 568.67 P
5 F
1.26 (SIGPLAN Notices,) 323.82 568.67 P
3 F
1.26 ( 25, 6 \0501990\051) 407.47 568.67 P
2.36 (150-162. Also to be published in ) 132 556.67 P
5 F
2.36 (Lisp and Symbolic Computation) 292.93 556.67 P
3 F
2.36 (,) 441.31 556.67 P
5 F
2.36 ( ) 444.06 556.67 P
3 F
2.36 (4, 3) 449.16 556.67 P
(\0501991\051) 132 544.67 T
(.) 161.29 544.67 T
(8.) 115 526.67 T
(Curtis, P) 132 526.67 T
(. T) 169.24 526.67 T
(ype inferencing in Smalltalk. Personal communication \0501989\051.) 180.68 526.67 T
(9.) 115 508.67 T
0.85 (Deutsch, L. P) 132 508.67 P
0.85 (. The Dorado Smalltalk-80 Implementation: Hardware Archi-) 192.28 508.67 P
0.28 (tecture\325) 132 496.67 P
0.28 (s Impact on Software Architecture. In Krasner) 164.95 496.67 P
0.28 (, G., editor) 369.66 496.67 P
0.28 (, ) 417.07 496.67 P
5 F
0.28 (Smalltalk-) 422.83 496.67 P
0.33 (80: Bits of History) 132 484.67 P
0.33 (, W) 213.88 484.67 P
0.33 (or) 227.85 484.67 P
0.33 (ds of Advice) 237.21 484.67 P
3 F
0.33 (, Addison-W) 291.58 484.67 P
0.33 (esley) 347.8 484.67 P
0.33 (, Reading, MA \0501983\051) 369.66 484.67 P
(1) 132 472.67 T
(13-126.) 137.09 472.67 T
(10.) 115 454.67 T
(Deutsch, L. P) 132 454.67 T
(. Richards benchmark. Personal communication \0501988\051.) 190.59 454.67 T
(1) 115 436.67 T
(1.) 120.09 436.67 T
0.07 (Deutsch, L. P) 132 436.67 P
0.07 (., and Schif) 190.72 436.67 P
0.07 (fman, A. M. Ef) 240.7 436.67 P
0.07 (\336cient Implementation of the Small-) 307.83 436.67 P
0.53 (talk-80 System. In ) 132 424.67 P
5 F
0.53 (Pr) 217.2 424.67 P
0.53 (oceedings of the 1) 227.78 424.67 P
0.53 (1th Annual ACM Symposium on the) 308.2 424.67 P
(Principles of Pr) 132 412.67 T
(ogramming Languages) 201.79 412.67 T
3 F
( \0501984\051 297-302.) 303.41 412.67 T
(12.) 115 394.67 T
-0.65 (Goldber) 132 394.67 P
-0.65 (g, A., and Robson, D. ) 167.8 394.67 P
5 F
-0.65 (Smalltalk-80: The Language and Its Implemen-) 262.83 394.67 P
(tation) 132 382.67 T
3 F
(. Addison-W) 157.64 382.67 T
(esley) 213.52 382.67 T
(, Reading, MA \0501983\051.) 235.38 382.67 T
(13.) 115 364.67 T
(Hennessy) 132 364.67 T
(, J. Stanford integer benchmarks. Personal communication \0501988\051.) 174 364.67 T
(14.) 115 346.67 T
-0 (Johnson, R. E., Graver) 132 346.67 P
-0 (, J. O., and Zurawski, L. W) 231.33 346.67 P
-0 (. TS: An Optimizing Com-) 349.9 346.67 P
0.98 (piler for Smalltalk. In ) 132 334.67 P
5 F
0.98 (OOPSLA \32588 Confer) 233.86 334.67 P
0.98 (ence Pr) 326.95 334.67 P
0.98 (oceedings) 361.38 334.67 P
3 F
0.98 (. Published as) 405.32 334.67 P
5 F
(SIGPLAN Notices) 132 322.67 T
3 F
(, 23, 11 \050) 211.65 322.67 T
(1988\051 18-26.) 251.01 322.67 T
(15.) 115 304.67 T
0.01 (LaLonde, W) 132 304.67 P
0.01 (. R., Thomas, D. A., and Pugh, J. R. An Exemplar Based Small-) 186.52 304.67 P
-0.45 (talk. In ) 132 292.67 P
5 F
-0.45 (OOPSLA \32586 Confer) 164.97 292.67 P
-0.45 (ence Pr) 255.22 292.67 P
-0.45 (oceedings) 288.22 292.67 P
3 F
-0.45 (. Published as ) 332.16 292.67 P
5 F
-0.45 (SIGPLAN Notic-) 394.29 292.67 P
(es) 132 280.67 T
3 F
(, 21, 11 \050) 141.15 280.67 T
(1986\051 322-330.) 180.52 280.67 T
(16.) 115 262.67 T
-0 (Lee, E. ) 132 262.67 P
5 F
-0 (Object Storage and Inheritance for S) 166.16 262.67 P
7 F
-0 (ELF) 328.79 262.67 P
5 F
-0 (, a Pr) 345.15 262.67 P
-0 (ototype-Based Object-) 369.45 262.67 P
2.19 (Oriented Pr) 132 250.67 P
2.19 (ogramming Language) 186.57 250.67 P
3 F
2.19 (. Engineer) 286.11 250.67 P
2.19 (\325) 333.86 250.67 P
2.19 (s thesis, Stanford University) 336.92 250.67 P
(\0501988\051.) 132 238.67 T
(17.) 115 220.67 T
0.14 (Lieberman, H. Using Prototypical Objects to Implement Shared Behavior in) 132 220.67 P
1.87 (Object-Oriented Systems. In ) 132 208.67 P
5 F
1.87 (OOPSLA \32586 Confer) 265.76 208.67 P
1.87 (ence Pr) 360.63 208.67 P
1.87 (oceedings) 395.95 208.67 P
3 F
1.87 (. Pub-) 439.89 208.67 P
(lished as ) 132 196.67 T
5 F
(SIGPLAN Notices) 172.89 196.67 T
3 F
(, 21, 11 \050) 252.54 196.67 T
(1986\051 214-223.) 291.91 196.67 T
(18.) 115 178.67 T
0.07 (McCall, K. The Smalltalk-80 Benchmarks. In Krasner) 132 178.67 P
0.07 (, G., editor) 370.28 178.67 P
0.07 (, ) 417.27 178.67 P
5 F
0.07 (Smalltalk-) 422.83 178.67 P
0.33 (80: Bits of History) 132 166.67 P
0.33 (, W) 213.88 166.67 P
0.33 (or) 227.85 166.67 P
0.33 (ds of Advice) 237.21 166.67 P
3 F
0.33 (, Addison-W) 291.58 166.67 P
0.33 (esley) 347.8 166.67 P
0.33 (, Reading, MA \0501983\051) 369.66 166.67 P
(153-174.) 132 154.67 T
(19.) 115 136.67 T
1 (Meyer) 132 136.67 P
1 (, B. Genericity versus Inheritance. In ) 160.24 136.67 P
5 F
1 (OOPSLA \32586 Confer) 331.27 136.67 P
1 (ence Pr) 424.4 136.67 P
1 (o-) 458.85 136.67 P
(ceedings) 132 124.67 T
3 F
(. Published as ) 170.44 124.67 T
5 F
(SIGPLAN Notices) 233.92 124.67 T
3 F
(, 21, 11 \050) 313.57 124.67 T
(1986\051 391-405.) 352.93 124.67 T
(20.) 115 106.67 T
1.02 (Moon, D. A. Object-Oriented Programming with Flavors. In ) 132 106.67 P
5 F
1.02 (OOPSLA \32586) 408.7 106.67 P
-0.58 (Confer) 132 94.67 P
-0.58 (ence Pr) 162.11 94.67 P
-0.58 (oceedings) 194.98 94.67 P
3 F
-0.58 (. Published as ) 238.92 94.67 P
5 F
-0.58 (SIGPLAN Notices) 300.64 94.67 P
3 F
-0.58 (, 21, 11 \050) 379.71 94.67 P
-0.58 (1986\051 1-16.) 417.32 94.67 P
FMENDPAGE
%%EndPage: "94" 39
%%Page: "95" 39
612 792 0 FMBEGINPAGE
108 630 468 648 R
7 X
0 K
V
7 F
0 X
(AN EFFICIENT IMPLEMENTATION OF S) 108 641.33 T
0 F
(ELF) 284.01 641.33 T
7 F
(95) 458.01 641.33 T
108 89 468 612 R
7 X
V
3 F
0 X
(21.) 115 604.67 T
0.03 (Namjoo, M.) 132 604.67 P
0.03 (, Agrawal, A., Jackson, D. C., and Quach, L.) 185.43 604.67 P
0.03 ( CMOS Gate Array) 382.17 604.67 P
0.33 (Implementation of the SP) 132 592.67 P
0.33 (ARC Architecture. In ) 244.6 592.67 P
5 F
0.33 (COMPCON \32588 Confer) 343.24 592.67 P
0.33 (ence) 447.87 592.67 P
(Pr) 132 580.67 T
(oceedings) 142.58 580.67 T
3 F
( \0501) 186.51 580.67 T
(988\051 10-13.) 198.41 580.67 T
(22.) 115 562.67 T
(ParcPlace Systems. ) 132 562.67 T
5 F
(Par) 220.19 562.67 T
(cPlace Newsletter \050W) 236.26 562.67 T
(inter 1988\051) 330.85 562.67 T
3 F
(, 1, ) 379.98 562.67 T
(2 \0501988\051.) 396.46 562.67 T
(23.) 115 544.67 T
-0.17 (Schaf) 132 544.67 P
-0.17 (fert, C., Cooper) 156.82 544.67 P
-0.17 (, T) 224.69 544.67 P
-0.17 (., Bullis, B., Kilian, M., and W) 235.91 544.67 P
-0.17 (ilpolt, C. An Introduc-) 369.95 544.67 P
0.88 (tion to T) 132 532.67 P
0.88 (rellis/Owl. In ) 171.23 532.67 P
5 F
0.88 (OOPSLA \32586 Confer) 234.33 532.67 P
0.88 (ence Pr) 327.23 532.67 P
0.88 (oceedings) 361.57 532.67 P
3 F
0.88 (. Published as) 405.5 532.67 P
5 F
(SIGPLAN Notices) 132 520.67 T
3 F
(, 21, 11 \050) 211.65 520.67 T
(1986\051 9-16.) 251.01 520.67 T
(24.) 115 502.67 T
0.37 (Steele, G. L., Jr) 132 502.67 P
0.37 (. LAMBDA: The Ultimate Declarative. AI Memo 379, MIT) 201.14 502.67 P
(Arti\336cial Intelligence Laboratory \0501976\051.) 132 490.67 T
(25.) 115 472.67 T
-0.48 (Steele, G. L., Jr) 132 472.67 P
-0.48 (., and Sussman, G. J. LAMBDA: The Ultimate Imperative. AI) 198.61 472.67 P
(Memo 353, MIT Arti\336cial Intelligence Laboratory \0501976\051.) 132 460.67 T
(26.) 115 442.67 T
-0 (Stein, L. A. Delegation Is Inheritance. In ) 132 442.67 P
5 F
-0 (OOPSLA \32587 Confer) 314.13 442.67 P
-0 (ence Pr) 405.27 442.67 P
-0 (oceed-) 438.72 442.67 P
(ings) 132 430.67 T
3 F
(. Published as ) 150.31 430.67 T
5 F
(SIGPLAN Notices) 213.79 430.67 T
3 F
(, 22, 12 \0501) 293.44 430.67 T
(987\051 138-146.) 338.3 430.67 T
(27.) 115 412.67 T
-0.39 (Stroustrup, B. ) 132 412.67 P
5 F
-0.39 (The C++ Pr) 195.31 412.67 P
-0.39 (ogramming Language) 249.23 412.67 P
3 F
-0.39 (. Addison-W) 346.19 412.67 P
-0.39 (esley) 401.67 412.67 P
-0.39 (, Reading,) 423.54 412.67 P
(MA \0501986\051.) 132 400.67 T
(28.) 115 382.67 T
0.38 (Suzuki, N. Inferring T) 132 382.67 P
0.38 (ypes in Smalltalk. In ) 230.3 382.67 P
5 F
0.38 (8th Annual ACM Symposium on) 325.5 382.67 P
(Principles of Pr) 132 370.67 T
(ogramming Languages) 201.79 370.67 T
3 F
( \0501981\051 187-199.) 303.41 370.67 T
(29.) 115 352.67 T
0.47 (Ungar) 132 352.67 P
0.47 (, D. M. ) 159.01 352.67 P
5 F
0.47 (The Design and Evaluation of a High-Performance Smalltalk) 194.62 352.67 P
0.86 (System) 132 340.67 P
3 F
0.86 (. Ph.D. thesis, the University of California at Berkeley \0501986\051. Pub-) 162.51 340.67 P
(lished by the MIT Press, Cambridge, MA \0501987\051.) 132 328.67 T
(30.) 115 310.67 T
0.75 (Ungar) 132 310.67 P
0.75 (, D., and Jackson, F) 159.01 310.67 P
0.75 (. T) 247.79 310.67 P
0.75 (enuring Policies for Generation-Based Storage) 259.97 310.67 P
0.45 (Reclamation. In ) 132 298.67 P
5 F
0.45 (OOPSLA \32588 Confer) 205.83 298.67 P
0.45 (ence Pr) 297.87 298.67 P
0.45 (oceedings) 331.78 298.67 P
3 F
0.45 (. Published as ) 375.71 298.67 P
5 F
0.45 (SIGP-) 440.55 298.67 P
(LAN Notices) 132 286.67 T
3 F
(, 23, 11 \050) 187.85 286.67 T
(1988\051 1-17.) 227.22 286.67 T
(31.) 115 268.67 T
-0.13 (Ungar) 132 268.67 P
-0.13 (, D., and Smith, R. B. S) 159.01 268.67 P
4 F
-0.12 (ELF) 262.03 268.67 P
3 F
-0.13 (: The Power of Simplicity) 279.8 268.67 P
-0.13 (. In ) 392.71 268.67 P
5 F
-0.13 (OOPSLA \32587) 409.85 268.67 P
-0.28 (Confer) 132 256.67 P
-0.28 (ence Pr) 162.11 256.67 P
-0.28 (oceedings) 195.29 256.67 P
3 F
-0.28 (. Published as ) 239.22 256.67 P
5 F
-0.28 (SIGPLAN Notices) 301.86 256.67 P
3 F
-0.28 (, 22, 12 \050) 381.24 256.67 P
-0.28 (1987\051 227-) 419.76 256.67 P
(241. Also to be published in ) 132 244.67 T
5 F
(Lisp and Symbolic Computation) 258.65 244.67 T
3 F
(,) 399.96 244.67 T
5 F
( ) 402.7 244.67 T
3 F
(4, 3 \0501991\051) 405.45 244.67 T
(.) 453.96 244.67 T
(32.) 115 226.67 T
0.46 (W) 132 226.67 P
0.46 (egner) 141.49 226.67 P
0.46 (, P) 165.45 226.67 P
0.46 (. Dimensions of Object-Based Language Design. In ) 176.29 226.67 P
5 F
0.46 (OOPSLA \32587) 409.26 226.67 P
-0.28 (Confer) 132 214.67 P
-0.28 (ence Pr) 162.11 214.67 P
-0.28 (oceedings) 195.29 214.67 P
3 F
-0.28 (. Published as ) 239.22 214.67 P
5 F
-0.28 (SIGPLAN Notices) 301.86 214.67 P
3 F
-0.28 (, 22) 381.24 214.67 P
-0.28 (, 12 ) 397.44 214.67 P
-0.28 (\050) 416.11 214.67 P
-0.28 (1987\051 168-) 419.76 214.67 P
(182.) 132 202.67 T
FMENDPAGE
%%EndPage: "95" 40
%%Page: "96" 40
612 792 0 FMBEGINPAGE
108 630 468 648 R
7 X
0 K
V
7 F
0 X
(96) 108 641.33 T
108 89 468 612 R
7 X
V
FMENDPAGE
%%EndPage: "96" 41
%%Trailer
%%BoundingBox: 0 0 612 792
%%Pages: 40 1
%%DocumentFonts: Times-Italic
%%+ Times-Roman
%%+ Times-Bold
%%+ Courier-Bold
%%+ Symbol
%%+ Helvetica
%%+ Helvetica-Bold
%%+ Courier
%%+ Helvetica-Oblique
